( i2c start,stop,tx,rx JCB 13:08 08/24/10)
module[ i2c"
: i2c-start \ with SCL high, change SDA from 1 to 0
d# 1 SDA i2c-half SCL-1 i2c-half d# 0 SDA i2c-half SCL-0 ;
: i2c-stop \ with SCL high, change SDA from 0 to 1
d# 0 SDA i2c-half SCL-1 i2c-half d# 1 SDA i2c-half ;
: i2c-rx-bit ( -- b )
d# 1 SDA i2c-half SCL-1 i2c-half SDA-rd SCL-0 ;
: i2c-tx-bit ( f -- )
0<> SDA i2c-half SCL-1 i2c-half SCL-0 ;
: i2c-tx ( b -- nak )
d# 8 d# 0 do dup d# 128 and i2c-tx-bit 2* loop drop i2c-rx-bit ;
: i2c-rx ( nak -- b )
d# 0 d# 8 d# 0 do 2* i2c-rx-bit + loop swap i2c-tx-bit ;
]module