在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
这几天一直在折腾nRF52832的硬件I2C,到了今天最终出现了成果,在此也印证了那句话:“耕耘就有收获” 52832的硬件I2C尽管官方提供了demo,可是自己对I2C通信理解的不够深入,再一个52832的代码也封装的太深了。可是对接口函数没有一个明白的解释(也能够说是我英文太渣,别人写了可是我没看懂。 。 。),这样对于首次接触nRF产品的人就造成了一定的难度 依据我的开发过程,还是先说明一下I2C的一些相关知识,由于我是先调硬件I2C搞了半天不正确头,然后再开发模拟I2C,模拟的成功了再来调试的硬件TWI(也就是52832的硬件I2C,全称预计是two wire interface) I2C通信须要两条线:SDA,SCL。 I2C通信设备有两种角色:master和slave。一般用户开发程序都是开发master端,然后去读写作为slave的外设,比方:eeprom,flash,sensor,display device。 在通信过程中,有两组特殊控制信号: (注意在通信过程中。SCL始终由master控制。这句话在做模拟I2C的时候就显得意义非凡了) master做写数据操作时。先是SCL和SDA都处于空暇状态(两者都是高电平),然后SDA由高变低(start信号);变低后SCL拉低,这个时候SDA就能够变成想要的电平。高电平代表bit为1,低电平代表bit为0。电平稳定后拉高时钟(拉高的目的是为了让slave读取数据,SCL为高时,SDA要保持不变。slave读取SDA的电平)。传输数据完了后要结束:先拉高SCL。然后拉高SDA。然后拉低SDA,一个完整的stop信号完毕了。 读数据操作时,start和stop这些时序一样,可是主机要去解析slave传来的数据(电平信号), 拉低SCL,然后释放SDA(即拉高SDA),一段延时之后拉高SCL再去读取SDA电平信号(既然是读取电平。这里必要设置为输入引脚啦),假设是高电平则记下是一个H_bit,否则是L_bit,读取到8位数据后假设还要继续读取则回复ACK,否则回复NCK。 以下以解说下master 和 slave传输时整体操作: 读数据操作。要先写进一个寄存器地址,再传递一个读命令 发送slave_address_Read前要先re_start,跟start信号一样 以下说明nRF52832的硬件I2C代码问题 nRF留出的API接口是
这个函数调用了app_twi_schedule函数,以此来导入到队列
想要调用app_twi_perform函数那么得准备好參数 解释:上面说的数据块的意思就是一个完整的I2C操作须要用到的信息:包括了slave地址。数据传递方向(读或者写),传输的数据data_buffer,数据长度length,有无结束标志(意思就是这团传输数据完了后是否结束通信了) 在官方SDK里面文件夹 首先初始化TWI 传输的内容
注意这里的AT_WRITE_NUMBER数组能够理解为一个数据缓冲区,能够通过改变这个数组的内容然后调用app_twi_perform来发数据出去(把const去掉) 读数据相似,demo用的自己定义传输函数 没想到这篇博客会有这么多人看。写的挺乱的。可是也不想再做改动了~~~写博客真的耗费时间啊~ 建议大家去看twi_sensor这个project |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论