在做项目的时候遇到的问题,IIC通信时读取数据始终为0XFF
下面从写数据开始介绍
向从机写数据步骤为:
开始信号->发送从机地址->等待应答->发送寄存器地址->等待应答->写数据->等待应答->停止信号
等待应答时,若SDA为0则代表成功应答
用示波器查看波形发现,在发送地址后SDA为高,无应答,说明未查询到从机
而从机数据手册中地址为0x6D,我最开始出错的代码如下
IIC_Write(0x6D,0x30,1,yali_ctrl);//在地址0x6D从机的0x30寄存器中写入yali_ctrl的指令
unsigned char IIC_Write(unsigned char addr, unsigned char reg, unsigned char len, unsigned char * data)
{
int i;
IIC_Start();
IIC_Send_Byte(addr | 0x00);
IIC_Wait_Ack();
IIC_Send_Byte(reg);
IIC_Wait_Ack();
for (i = 0; i < len; i++)
{
IIC_Send_Byte(data[i]);
IIC_Wait_Ack();
}
IIC_Stop();
return 0;
}
最后发现,IIC通信中,发送完开始信号后,再发送的八位中,只有高七位是从机地址,最低位0、1代表读写
所以从机地址0x6D=0110_1101在我的写法中,最低为1代表了读写,实际发送的地址是0110110,所以无法检测到从机,所以把地址改为1101_101x,这样最低一位代表读写,高七位作为地址,便能访问到从机。文章来源:https://www.toymoban.com/news/detail-575067.html
IIC_Write(0xDA,0x30,1,yali_ctrl);文章来源地址https://www.toymoban.com/news/detail-575067.html
到了这里,关于IIC通信从机无应答(读取数据始终为0XFF)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!