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

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试一下
wamcncn 回答时间: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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版