ctfsoft 发表于 2014-12-24 01:43:04

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;
}

巅峰残狼 发表于 2014-12-24 08:23:54

REG_data= buf<<8;
REG_data |= buf;

假设buf是高位,你这么处理一下,然后return REG_data;

晓枫VS枯叶 发表于 2014-12-24 09:34:48

一般不是读地址发送完了就等待应答么,你怎么就直接开始读了!

奔跑小蜗牛 发表于 2014-12-24 12:28:53

REG_data = (buf<<8)|buf;把buf buf换成变量,unsigned int temp0,unsigned int temp1试一下

wambob 发表于 2014-12-24 14:18:34

本帖最后由 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).

ctfsoft 发表于 2014-12-25 00:09:22

谢谢,我已经解决了。是中间应该用应答,I2C_Ack();我用了I2C_NoAck();昨天晚上折腾到三点多。
谢谢大家
页: [1]
查看完整版本: stm32f103c8t6通过I2C模拟读写16位数据