stm32f103c8t6通过I2C模拟读写16位数据
通过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;
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= I2C_RadeByte();
I2C_NoAck();
buf= I2C_RadeByte();
I2C_WaitAck();
I2C_Stop();
REG_data = (buf<<8)|buf;
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<<8;
REG_data |= buf;
假设buf是高位,你这么处理一下,然后return REG_data; 一般不是读地址发送完了就等待应答么,你怎么就直接开始读了! REG_data = (buf<<8)|buf;把buf buf换成变量,unsigned int temp0,unsigned int temp1试一下 本帖最后由 wambob 于 2014-12-24 14:49 编辑
u8 buf
buf 是数组的话.从下标0开始,你接收1个16数据 不是应该定义 u8 buf
I2C_SendByte(SlaveAddress+1);//I2C 地址常用7位,最低位是读写标志,合成8位一个字节。
这里不明白 地址7位+读写1位,合成8位 也应该是(SlaveAddress|0x01).
谢谢,我已经解决了。是中间应该用应答,I2C_Ack();我用了I2C_NoAck();昨天晚上折腾到三点多。
谢谢大家
页:
[1]