你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32f103c8t6通过I2C模拟读写16位数据

[复制链接]
ctfsoft 提问时间:2014-12-24 01:43 /
通过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;
}

收藏 评论5 发布时间:2014-12-24 01:43

举报

5个回答
巅峰残狼 回答时间:2014-12-24 08:23:54
REG_data  = buf[0]<<8;
REG_data |= buf[1];

假设buf[0]是高位,你这么处理一下,然后return REG_data;
晓枫VS枯叶 回答时间:2014-12-24 09:34:48
一般不是读地址发送完了就等待应答么,你怎么就直接开始读了!
奔跑小蜗牛 回答时间:2014-12-24 12:28:53
REG_data = (buf[1]<<8)|buf[0];把buf[0] buf[1]换成变量,unsigned int temp0,unsigned int temp1试一下
wambob 回答时间:2014-12-24 14:18:34
本帖最后由 wambob 于 2014-12-24 14:49 编辑

u8 buf[2]

buf 是数组的话.从下标0开始,你接收1个16数据 不是应该定义 u8 buf[1]


I2C_SendByte(SlaveAddress+1);//I2C 地址常用7位,最低位是读写标志,合成8位一个字节。
这里不明白 地址7位+读写1位,合成8位 也应该是  (SlaveAddress|0x01).
ctfsoft 回答时间:2014-12-25 00:09:22
谢谢,我已经解决了。是中间应该用应答,I2C_Ack();我用了I2C_NoAck();昨天晚上折腾到三点多。
谢谢大家

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版