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;
}