关于I2C总线模拟程序
答案:1 悬赏:0 手机版
解决时间 2021-11-12 06:04
- 提问者网友:温柔港
- 2021-11-11 15:31
关于I2C总线模拟程序
最佳答案
- 五星知识达人网友:深街酒徒
- 2021-11-11 16:33
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;
}
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;
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯