永发信息网

I2C无应答问题

答案:4  悬赏:80  手机版
解决时间 2021-01-31 06:09
我现在用STC单片机的仿真器Insight ME-52进行模拟I2C总线,和I2C器件IQS222进行通信,就是一直收不到ACK,一值运行在while(SDA)这个地方,我程序各方面都检查过没什么问题,请各位高手指点下是什么原因
最佳答案
1. 示波器检查波形是否是方波, 没接外部上拉的时候, 波形烂的一b, 从机是无法检测到的..

2. 检查时序, 下一个i2c中文pdf文档,应该到处都有下,我最早写i2c就是对着这个写的, 仔细研究下时序, 看看你的clk和data的时序配合是否正确.

3. 确定i2c的从机地址有没有发对.

基本就是这些毛病....
全部回答
建议您看看i2c通信协议 setb sda nop nop setb scl ;以上程序把sda和scl拉高,等待对方发出应答位 clr ack ;清楚本机内ack(应答位)的值,等待接收 nop nop ;等待时序 mov c,sda ;把sda的值送入c jc cend ;判断c,跳转 setb ack ;ack置位,应答成功 cend: nop clr scl ;c=1,则拉低时钟,准备下一次发送 nop ret 这个程序只是应答成功的,如果失败,ack仍然为1。 至于时序,请参考i2c通信协议 sda是用伪指令定义成的一个端口的名字,例:sda equ p1.2 sda其实就是指io口:p1.2 mov c,sda和sda和set sda 分别 对sda这个io口进行了读和写操作。
************************************************************************* I2C.H 标准80C51模拟I2C总线程序头文件 ******************************************************************************/ #ifndef I2C_H #define I2C_H //定义I2C操作模式 #define I2C_RECV 0 #define I2C_SEND 1 #define I2C_SrRECV 2 //I2C总线初始化 void I2C_Init(); bit I2C_On ( unsigned char Mode, //操作模式 unsigned char SLA, //从机地址 unsigned char Addr, //子地址 unsigned char *Buf, //数据缓冲区 unsigned char Size //数据长度 ); #endif //I2C_H #i nclude #i nclude "I2C.H" //模拟I2C总线的管脚定义 sbit I2C_SCL = P1^6; //定义I2C总线时钟信号 sbit I2C_SDA = P1^7; //定义I2C总线数据信号 void I2C_Delay() { unsigned char t; t = 10; while ( --t != 0 ); //延时2*t个机器周期 } void I2C_Init() { I2C_SCL = 1; I2C_Delay(); I2C_SDA = 1; I2C_Delay(); } void I2C_Start() { I2C_SDA = 1; I2C_Delay(); I2C_SCL = 1; I2C_Delay(); I2C_SDA = 0; I2C_Delay(); I2C_SCL = 0; I2C_Delay(); } void I2C_Write(unsigned char dat) { unsigned char t = 8; do { I2C_SDA = (bit)(dat & 0x80); dat <<= 1; I2C_SCL = 1; I2C_Delay(); I2C_SCL = 0; I2C_Delay(); } while ( --t != 0 ); } unsigned char I2C_Read() { unsigned char dat; unsigned char t = 8; I2C_SDA = 1; //在读取数据之前,要把SDA拉高,使之处于输入状态 do { I2C_SCL = 1; I2C_Delay(); dat <<= 1; if ( I2C_SDA ) dat++; I2C_SCL = 0; I2C_Delay(); } while ( --t != 0 ); return dat; } bit I2C_GetAck() { bit Ack; I2C_SDA = 1; I2C_Delay(); I2C_SCL = 1; I2C_Delay(); Ack = I2C_SDA; I2C_SCL = 0; I2C_Delay(); return Ack; } void I2C_PutAck(bit Ack) { I2C_SDA = Ack; I2C_Delay(); I2C_SCL = 1; I2C_Delay(); I2C_SCL = 0; I2C_Delay(); } void I2C_Stop() { I2C_SDA = 0; I2C_Delay(); I2C_SCL = 1; I2C_Delay(); I2C_SDA = 1; I2C_Delay(); } bit I2C_On ( unsigned char Mode, //操作模式 unsigned char SLA, //从机地址 unsigned char Addr, //子地址 unsigned char *Buf, //数据缓冲区 unsigned char Size //数据长度 ) { //启动I2C总线 I2C_Start(); if ( Mode != I2C_RECV ) { //发送SLA+W I2C_Write(SLA & 0xFE); if ( I2C_GetAck() ) { I2C_Stop(); return 1; } //发送子地址 I2C_Write(Addr); if ( I2C_GetAck() ) { I2C_Stop(); return 1; } if ( Mode == I2C_SEND ) { //发送数据 do { I2C_Write(*Buf++); if ( I2C_GetAck() ) { I2C_Stop(); return 1; } } while ( --Size != 0 ); //发送完毕 I2C_Stop(); return 0; } else { I2C_Start(); //发送重复起始条件 } } //发送SLA+R I2C_Write(SLA | 0x01); if ( I2C_GetAck() ) { I2C_Stop(); return 1; } //接收数据 for (;;) { *Buf++ = I2C_Read(); if ( --Size == 0 ) { I2C_PutAck(1); //接收完最后一个数据时发送NACK break; } I2C_PutAck(0); } //接收完毕 I2C_Stop(); return 0; } 看看有没有帮助
有几种可能: 1:SDA和SCL的线有无接反; 2:IQS222的SDA和SCL是否加上拉电阻; 3:IQS222的读写地址是否写对。 自己查查吧,问题不大。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
信用卡没还公安局来电话是手机电话不是做机电
男女牵手是什么成语
打耳洞后耳朵发炎了
2014银鹭花生牛奶代言人
请问我要做同声传译需要什么样的英语水平,的
福建沙县一品相思小吃这个地址在什么地方,我
下图为胚胎移植的基本程序及早期胚胎发育过程
谢娜是哪个大学毕业的?
马上要毕业了你对你的小伙伴有什么话想说
女同事和自己的男朋友相互拥抱,被我不小心看
我的男任男朋友对我说,现在他对我的是在爱与
求助 我的rayfire1.57版本插件,为什么没有De
5.3×0.8-0.82×0.3用简便方法
摩托车电瓶带35W疝气灯多长时间就没电了
这个罗汉松值钱吗?
推荐资讯
凯迪拉克xts清洗液不足
定做一件羽绒服大概有多少利润?
大金螺杆机如何换油
2016雪佛兰科鲁兹车身比2015款长多少
丰台区六里桥莲花池西里邮编
依米跆拳道馆地址在哪,我要去那里办事
证大五道口大厦电动汽车充电站地址有知道的么
汕头峡山哪里按摩好
广场宾馆(重庆梁平)地址在什么地方,想过去办
蝌蚪每年什么时候出生
康佳电视调到USB模式显示无设备,然后就切换
疏水阀是装在进气管还是排气管
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?