关于I2C总线模拟程序
发布网友
发布时间:2022-05-08 00:09
我来回答
共1个回答
热心网友
时间:2022-07-01 22:01
1、接收从机的ACK信号,把SDA置高是为了读取ACK信号,你必须要再送一个SCK时钟信号,从机才会发送低电平的ACK信号给主机。IIC是主从式同步通信,主机必须要发送时钟来同步数据位。
2、读取ACK位,只要在ACK的SCK时钟内读SDA,为低就是从机发送了ACK,为高从机没有应答,这时要重新发送一遍数据。
3、通过停止IIC总线结束传输。
4、建议到网上搜点关于iic的pdf资料。
实例代码如下:
//IIC存储器函数
void iic_wait(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void iic_stop(void)
{
SDA=0;
SCL=0;
iic_wait();
SCL=1;
iic_wait();
SDA=1;
}
void iic_start(void)
{
SDA = 1;
SCL = 1;
iic_wait();
SDA = 0;
iic_wait();
SCL = 0;
}
void iic_ack(void)
{
SDA=0;
iic_wait();
SCL=1;
iic_wait();
SCL=0;
}
void iic_no_ack(void)
{
SDA=1;
iic_wait();
SCL=1;
iic_wait();
SCL=0;
}
bit iic_wait_ack(void)
{
uchar errtime;
errtime=255;
//uint errtime = 1000;
SDA=1;
iic_wait();
SCL=1;
iic_wait();
while(SDA);
SCL=0;
return 1;
}
void iic_send_byte(uchar idata sbyte)
{
uchar i = 8;
while(i--)
{
SCL = 0;
_nop_();
_nop_();
_nop_();
SDA = (bit)(sbyte&0x80);
sbyte <<= 1;
iic_wait();
SCL = 1;
iic_wait();
}
SCL=0;
}
uchar iic_receive_byte(void)
{
uchar i=8;
uchar ddata=0;
SDA=1;
while(i--)
{
ddata <<= 1;
SCL=0;
iic_wait();
SCL=1;
iic_wait();
ddata |= SDA;
}
SCL=0;
return ddata;
}