通过stm32f103c8t6的I2C模拟读取和写入16数据,寄存器地址也是16位。现在8位可以正常写,16的读出来是高位是FF,低位正常。不知道是写的有问题,还是读的有问题。附上源码。请高手指点一下。谢谢 //从16位地址读16字节***************************************** u16 Single_Read16_add16(unsigned char SlaveAddress,u16 REG_Address) { u16 REG_data=0; u8 buf[2]; if(!I2C_Start())return FALSE; I2C_SendByte(SlaveAddress); if(!I2C_WaitAck()){I2C_Stop();test=1; return FALSE;} I2C_SendByte((u8)(REG_Address>>8)); I2C_WaitAck(); I2C_SendByte(REG_Address&0x00ff); //设置低起始地址 I2C_WaitAck(); I2C_Start(); I2C_SendByte(SlaveAddress+1);//I2C 地址常用7位,最低位是读写标志,合成8位一个字节。 I2C_NoAck(); buf[0]= I2C_RadeByte(); I2C_NoAck(); buf[1]= I2C_RadeByte(); I2C_WaitAck(); I2C_Stop(); REG_data = (buf[1]<<8)|buf[0]; return REG_data; } 写入16位数据函数: bool Single_Write16(unsigned char SlaveAddress,u16 REG_Address, u8 *buf,u16 num) { u8 i=0; if(!I2C_Start())return FALSE; I2C_SendByte(SlaveAddress); if(!I2C_WaitAck()){I2C_Stop(); return FALSE;} I2C_SendByte((u8)(REG_Address>>8)); //高八位地址 I2C_WaitAck(); I2C_SendByte(REG_Address&0x00ff); //低八位地址 I2C_WaitAck(); for(;num;num--) { I2C_SendByte(*buf++); I2C_WaitAck(); } I2C_Stop(); delay5ms(); return TRUE; } |
REG_data |= buf[1];
假设buf[0]是高位,你这么处理一下,然后return REG_data;
u8 buf[2]
buf 是数组的话.从下标0开始,你接收1个16数据 不是应该定义 u8 buf[1]
I2C_SendByte(SlaveAddress+1);//I2C 地址常用7位,最低位是读写标志,合成8位一个字节。
这里不明白 地址7位+读写1位,合成8位 也应该是 (SlaveAddress|0x01).
谢谢大家