IIC操作不成功,我利用在程序中间设置断点的方法,发现是主机检测应答信号子函数不成功,我检查过了,这个函数应该没有问题,谁能看看这个函数,谢谢了。用的是msp430。
#include <msp430x14x.h> #include "iic.h"
//延时15us void delay(void) { unsigned char q0; for(q0=0;q0<200;q0++); }
//IIC初始化 void InitIIC(void) { SDA_OUT; SCL_OUT; S_SDA; S_SCL; }
//启动IIC void Start(void) { SDA_OUT;
S_SCL; delay(); S_SDA; delay(); C_SDA; delay(); C_SCL; delay(); }
//释放IIC void Stop(void) { SDA_OUT;
C_SCL; delay(); S_SCL; delay(); C_SDA; delay(); S_SDA; delay(); }
//主机应答子函数 void Ack(void) { SDA_OUT;
C_SDA; delay(); S_SCL; delay(); C_SCL; delay(); S_SDA; delay(); }
//主机不应答子函数 void NoAck(void) { SDA_OUT;
S_SDA; delay(); S_SCL; delay(); C_SCL; delay(); }
//检测应答信号 uchar TestAck(void) { uchar ack; S_SDA; //不明白 delay();//不明白
C_SCL; delay();
S_SCL; delay(); SDA_IN; delay(); ack=SDA_IN_ZHI; delay(); C_SCL; //通知从器件释放总线 delay(); return ack; }
//写一个字节 void Write8Bit(unsigned char input) { uchar i,temp;
//SDA_OUT;//写之前,释放总线,自己写的 //S_SDA; //delay(); SDA_OUT; delay(); for(i=0;i<8;i++) { temp=input; temp=temp<<i;
C_SCL; // 低电平允许数据变化 delay();
if( (0X80&temp) == 1) S_SDA; else C_SDA; delay();
S_SCL; //高电平要求数据稳定,通知IIC器件可以接收了 delay(); } S_SDA; //让IIC器件拉低SDA线 delay(); }
//读一个字节 unsigned char Read8Bit() { uchar i,temp; SDA_OUT;//读之前,释放总线,自己写的 S_SDA; delay(); for(i=0;i<8;i++) { S_SCL; //高电平数据稳定,可以读取,读取可靠 delay();
SDA_IN; temp=temp<<1; if(SDA_IN_ZHI) temp=temp|0X01; delay(); C_SCL; //低电平允许数据变化 delay(); } return temp; }
|