打印
[STM32F1]

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

[复制链接]
1200|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
elephant00|  楼主 | 2024-2-26 15:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
通过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;
}

使用特权

评论回复
沙发
t1ngus4| | 2024-2-29 22:36 | 只看该作者
好像I2C也是需要配置是几位的宽度吧

使用特权

评论回复
板凳
cen9ce| | 2024-2-29 22:55 | 只看该作者
这个我觉得应该是代码的问题

使用特权

评论回复
地板
y1n9an| | 2024-2-29 23:28 | 只看该作者
你可以用硬件I2C试试啊,用cubemx配置一下就好了

使用特权

评论回复
5
故意相遇| | 2024-3-15 21:53 | 只看该作者
那你就直接使用8位的数据进行通信不就行了吗

使用特权

评论回复
6
白马过平川| | 2024-3-16 01:00 | 只看该作者
用模拟I2C,还用这种模拟读写16位数据吗?

使用特权

评论回复
7
风凉| | 2024-3-16 03:00 | 只看该作者
在发送和接收16位数据时,需要考虑字节顺序

使用特权

评论回复
8
西洲| | 2024-3-16 05:00 | 只看该作者
有些设备要求先发送高位字节,然后发送低位字节,而有些设备则要求相反的顺序。确保你的代码中发送和接收的字节顺序是正确的。

使用特权

评论回复
9
捧一束彼岸花| | 2024-3-16 07:00 | 只看该作者
确认目标设备的数据格式要求

使用特权

评论回复
10
在曼谷的春| | 2024-3-16 09:00 | 只看该作者
有些设备可能要求数据以特定的格式进行发送和接收,比如大端序或小端序。

使用特权

评论回复
11
失物招領| | 2024-3-16 11:00 | 只看该作者
I2C通信的时钟频率设置可能会影响数据传输的稳定性。

使用特权

评论回复
12
将爱藏于深海| | 2024-3-16 13:00 | 只看该作者
确认目标设备的I2C地址设置是否正确

使用特权

评论回复
13
春日负喧| | 2024-3-16 19:00 | 只看该作者
如果你在使用STM32F103C8T6与其他设备进行I2C通信时使用了电平转换电路(比如使用3.3V的STM32与5V的设备通信),确保电平转换电路工作正常,不会导致数据损坏

使用特权

评论回复
14
一只眠羊| | 2024-3-16 21:00 | 只看该作者
可能是数据顺序的问题吧,一般是这样

使用特权

评论回复
15
classroom| | 2024-12-31 11:27 | 只看该作者
写操作未正确设置高位地址

使用特权

评论回复
16
laocuo1142| | 2024-12-31 11:27 | 只看该作者
读操作时未发送正确的地址或命令

使用特权

评论回复
17
powerantone| | 2024-12-31 11:29 | 只看该作者
STM32的I2C配置或代码问题

使用特权

评论回复
18
stormwind123| | 2024-12-31 11:29 | 只看该作者
时序问题

使用特权

评论回复
19
probedog| | 2024-12-31 11:30 | 只看该作者
I2C通信发送或接收数据的时序不正确

使用特权

评论回复
20
两只袜子| | 2024-12-31 11:30 | 只看该作者
使用逻辑分析仪或示波器捕获I2C总线的信号

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1007

主题

3287

帖子

7

粉丝