wince下调试I2C总线驱动问题求助!

TomiTwo 2012-07-14 09:27:10
我在调试一个I2C驱动,用IO口模拟的I2C总线,目前ADS调试裸机通过,但是加载到系统里面,总线时序就不对了,总收不到从设备发出的应答信号,即使我发送设备地址也不到应答。请问高手帮帮忙呀!我调试快两周了,没搞定呀!
下面是我的写字节函数,延时已经使用了精确延时,目前是20us(因为在ADS下调试通过),1us-60us延时都试过。

//----------------------------------------------------------------------------------
unsigned char I2c_WriteByte(unsigned char value)
//----------------------------------------------------------------------------------
// writes a byte on the Sensibus and checks the acknowledge
{
int error=0, i1=0, i2=0;
// unsigned char ub;

for(i2 = 0; i2 < 8; i2++ )
{ // setup data onto SDA
if(value & 0x80){
SDA_Set; //SetSDA( 1 );
}
else{
SDA_Clear; //SetSDA( 0 );
}
Delay_us(1); //I2C timing: data setup time > 200ns

// issue a clock
SCL_Set; //SetSCL( 1 );
Delay_us(1); //I2C timing: SCL high time > 0.6us
SCL_Clear; //SetSCL( 0 );
Delay_us(2); //I2C timing: SCL low time > 1.3us
value= value<< 1;
}
//check ACK(Low state) from I2C device
SDA_OutDisable; //set SDA as input

Delay_us(1); //I2C timing: data(from I2C device) setup time > 200ns
SCL_Set; //SetSCL( 1 ); // issue a clock
Delay_us(1); //I2C timing: SCL high time > 0.6us
if(s2440IOP->rGPFDAT>>1) //read ACK_BIT issued from I2C device
{
// NO ACK, so setup STOP condition
SCL_Set; //SetSCL( 1 );
Delay_us(1); //I2C timing: stop setup timing > 0.6us
SDA_Set; //SetSDA( 1 ); SDA is in input status!
return -(i1+1); // no acknowledgement -> failed
}
SCL_Clear; //SetSCL( 0 );
Delay_us(2); //I2C timing: SCL low time > 1.3us
//check ACK passed, config SDA as output for further outputing
SDA_OutEnable;
SDA_Set;
return 0;;

}
...全文
257 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
saloon_yuan 2012-08-22
  • 打赏
  • 举报
回复
即使我发送设备地址也不到应答????
看起来像是地址冲突,建议楼主查查是否有I2C设备地址重复了。
WINCEANDROID 2012-08-01
  • 打赏
  • 举报
回复
提高驱动线程优先级。或关闭掉其他驱动试。
TomiTwo 2012-07-17
  • 打赏
  • 举报
回复
上拉已经加了,读数据时也设置为input,硬件应该没有问题,ADS裸机跑程序是正常的。
zhengmeifu 2012-07-17
  • 打赏
  • 举报
回复
看一下你的硬件是否有问题,有加上啦了吗?你若要读入SDA数据线,你的IO口要设为输入,这时外面最好要上啦,否则设备驱动能力不足,是读不到ACK的。
xqhrs232 2012-07-15
  • 打赏
  • 举报
回复
只有自己根据数据手册对I2C的时序了,多看几遍直到你看懂了就知道怎么去调了,我也是这样过来的

19,503

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧