I2C无法写入和读出寄存器值

博客分享了一次关于6124B控制DMS模组功能开发中遇到的I2C读写失败问题及解决方案。作者因误删源码而加班赶制,发现I2C读写失败源于6124B寄存器地址为8bit,而其函数设置为16bit,导致设备无法正确获取地址。解决办法在于检查并匹配I2C寄存器地址的位数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前不小心把自己做的通过6124B控制dms模组的功能的源码全给删掉了,可是吓死我了,没办法只能自己加班偷偷赶出来。

这次给我的教训就是所有的源码都应该留有备份,除非确认不需要的源码。

 

凭借着我的记忆,我其实已经把6124B的功能做出来了,只是因为I2C读写失败的问题导致一直接受不了dms的图像。我用的是我之前写的linux应用层的i2c设备文件的读写方式进行控制i2c接口的。一直以为是没有问题的。之所以写入和读取不成功是因为6124B的寄存器地址是8bit的,而我之前写的读写i2c的函数里面的地址是16bit的。这导致了i2c从设备一直不能正确获取到寄存器的地址。

 

解决:查看i2c的寄存器地址是8bit还是16bit。不同长度的地址会出现错误。

 

### I2C 控制寄存器配置与功能 I2C接口的控制寄存器在实现其通信功能中扮演着至关重要的角色。这些寄存器允许开发者对I2C总线的行为进行细致的控制配置,以满足特定的应用需求。 #### 控制寄存器1 (CR1) 控制寄存器1包含了一系列位字段,用于控制I2C模块的基本操作。例如,它可以启用或禁用I2C模块、设置应答位(ACK)、启动或停止条件等。通过修改这个寄存器中的相应位,可以开启或关闭I2C的功能,以及决定是否响应接收到的地址[^1]。 #### 控制寄存器2 (CR2) 控制寄存器2提供了额外的控制选项,比如中断使能、DMA请求使能及错误中断使能等。它还包含了当前传输方向的信息,即主设备是作为发送方还是接收方工作。此外,该寄存器还可以用来设置外设时钟频率,这对于正确计算波特率分频非常重要[^1]。 #### 数据寄存器 (DR) 数据寄存器用于存储将要发送的数据或者已经从总线上读取的数据。当主设备准备发送数据时,需要先将数据写入寄存器;而在接收模式下,接收到的数据会自动保存到该寄存器中等待读出[^1]。 #### 状态寄存器1 (SR1) 状态寄存器2 (SR2) 这两个寄存器共同构成了一个完整的状态信息集合。它们反映了I2C模块当前的工作状况,包括但不限于检测到了起始条件、结束条件、是否收到了地址匹配信号、是否有数据被成功发送或接收等。程序员可以通过检查这些标志位来判断I2C通信的状态并据此做出相应的处理。 #### 时钟控制寄存器 (CCR) 时钟控制寄存器决定了SCL线上的时钟频率,从而影响了整个I2C总线的速度。根据应用场合的不同(标准模式或快速模式),需要向这个寄存器写入适当的数来设定正确的通信速率。 #### 上升时间寄存器 (TRISE) 上升时间寄存器用来补偿由于外部上拉电阻导致的SCL信号线上升沿变慢的问题。通过对这个寄存器进行适当的配置,可以帮助确保即使在较高的通信速度下也能维持良好的信号完整性。 #### 地址寄存器1 (OAR1) 地址寄存器2 (OAR2) 对于工作在从机模式下的I2C设备来说,这两个寄存器用于定义其监听的地址。OAR1通常存放7位地址,而OAR2则可能用于第二个地址或是作为扩展地址的一部分使用,具体取决于芯片的设计支持的功能。 在初始化I2C接口时,除了上述提到的各种寄存器之外,还需要考虑数字滤波器的设置以及相关的时钟配置。如引用[2]所示,`i2c_init`函数接受三个参数:所选I2C外设、数字滤波器数量以及时钟控制寄存器。其中最后一个参数直接关联到如何调整I2C通信的时序特性,以适应不同的硬件环境性能要求。 ```c // 示例代码展示了一个典型的I2C初始化调用 i2c_init(I2Cx, 0, 0x00100101); // 其中I2Cx代表具体的I2C实例 ``` 以上就是关于I2C控制寄存器的一些基本介绍及其主要功能概述。每种寄存器都有其独特的作用,在实际编程过程中合理地配置这些寄存器能够极大地提升系统的灵活性与效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值