stm32f103c8t6通过I2C模拟读写16位数据出来是高位是FF

2019-07-14 18:02发布

通过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;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
redsworm
1楼-- · 2019-07-14 23:15
一般不是读地址发送完了就等待应答么,你怎么就直接开始读了!
报纸弟弟麦花
2楼-- · 2019-07-15 03:09
REG_data = (buf[1]<<8)|buf[0];把buf[0] buf[1]换成变量,unsigned int temp0,unsigned int temp1试一下
冬冬5241
3楼-- · 2019-07-15 03:44
 精彩回答 2  元偷偷看……
Ehunt
4楼-- · 2019-07-15 04:49
谢谢,我已经解决了。是中间应该用应答,I2C_Ack();我用了I2C_NoAck();昨天晚上折腾到三点多。
谢谢大家

一周热门 更多>