通过
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;
}
谢谢大家
一周热门 更多>