这几天一直在折腾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。

在通信过程中,有两组特殊控制信号:

start :scl为高电平时,sda由高电平变为低电平。

stop: scl为高电平时,sda由低电平变为高电平。

(注意在通信过程中。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。

ACK信号是SCL拉低后给SDA一个低电平,然后拉高SCL;

ANK信号是SCL拉低和给SDA一个高电平。然后拉高SCL。

以下以解说下master 和 slave传输时整体操作:

master向slave写数据,一般slave端写数据都要一个确定的寄存器地址。即你要往这个外设的哪个位置传数据

以eeprom为例,先发送器件地址0xAE(8位数据。高7位是地址。LSB是传输数据方向:0;0代表写。1代表读,能够当做out。in来理解这样easy记住)。

然后发送寄存器地址,然后发送数据。

时序上面能够是

start–slave_address_write–register_address–N*Send_data–stop

Send_data每发一个字节,slave会回应一个“CK信号”。假设是ACK则发送数据成功了。否则失败

由于是连续的写数据,因此中间能够没有stop,start

读数据操作。要先写进一个寄存器地址,再传递一个读命令

start–slave_address_write–register_address–start–slave_address_Read–N*Receive_data–stop

发送slave_address_Read前要先re_start,跟start信号一样

Receive_data 是接收数据,这时要去识别SDA电平而且解析数据,作出ACK回应。最后一个字节接收完毕回复NCK信号;然后stop。

以下说明nRF52832的硬件I2C代码问题

nRF留出的API接口是

ret_code_t app_twi_perform(app_twi_t *  \              p_app_twi,app_twi_transfer_t const * p_transfers,\
uint8_t number_of_transfers,\
void (* user_function)(void)\
)

这个函数调用了app_twi_schedule函数,以此来导入到队列

ret_code_t app_twi_schedule(app_twi_t *                   p_app_twi,
app_twi_transaction_t const * p_transaction)

想要调用app_twi_perform函数那么得准备好參数

1、p_app_twi。这是在TWI传输队列里申请一个位置

英文原话是creating an instance of the TWI transaction manager.

2、p_transfers,这是包括了要传输的数组块的一个数组

3、number_of_transfers,这个是你传输数据块的个数

4、user_function,一个用户的回调函数的函数指针,数据块传输完了API内部会调用这个user_function

解释:上面说的数据块的意思就是一个完整的I2C操作须要用到的信息:包括了slave地址。数据传递方向(读或者写),传输的数据data_buffer,数据长度length,有无结束标志(意思就是这团传输数据完了后是否结束通信了)

在官方SDK里面文件夹

examples\peripheral\twi_master_using_app_twi里打开project

首先初始化TWI



传输数据

传输的内容



注意AT24C02_init_transfers是一个全局变量数组

也就是它的地址是在堆里面的,不会自己主动释放。这么做的原因是这个数组的地址可能会被多次调用,而放在某个函数里面会造成地址不同造成错误

demo里面有解释

  // [these structures have to be "static" - they cannot be placed on stack
// since the transaction is scheduled and these structures most likely
// will be referred after this function returns]
static app_twi_transfer_t const transfers[] =
{
AT24C02_READ(&AT24C02_first_page_addr,AT_buffer,5) };

注意这里的AT_WRITE_NUMBER数组能够理解为一个数据缓冲区,能够通过改变这个数组的内容然后调用app_twi_perform来发数据出去(把const去掉)

读数据相似,demo用的自己定义传输函数

仿写一个

没想到这篇博客会有这么多人看。写的挺乱的。可是也不想再做改动了~~~写博客真的耗费时间啊~

建议大家去看twi_sensor这个project

路径:NORDIC官方SDK\nRF52_SDK_11.0.0\examples\peripheral\twi_sensor

nRF52832之硬件I2C的更多相关文章

  1. STM32 硬件I2C 到底是不是个坑?

    /** ****************************************************************************** * @author    Maox ...

  2. STM32F407的硬件I2C

    源:STM32F407的硬件I2C 我使用的是STM32的固件库. 硬件模块使用之前必须配置其参数,I2C的配置如下: void IIC_Config(void) { GPIO_InitTypeDef ...

  3. STM32F10x_模拟I2C读写_硬件I2C读写

    STM32F10x_模拟I2C读写EEPROM STM32F10x_硬件I2C读写EEPROM(标准外设库版本) STM32F10x_硬件I2C主从通信(轮询发送,中断接收)

  4. 浅谈STM32L071硬件I2C挂死

    STM32的IIC问题一直存在,在网上也被很多人吐槽,然而FAE告诉我,硬件IIC的问题在F1,F3,F4系列单片机存在,而在L0上已经解决了,然而这几天调试加密芯片和显示芯片,都是IIC芯片,却再一 ...

  5. MSP430G2553 Launchpad 硬件I2C驱动

    一.USCI I2C 驱动介绍 对于MSP430G2553,硬件I2C由外设USCI(Universal Serial Communication Interface)提供.USCI又分为USCI_A ...

  6. STM32F10x_硬件I2C主从通信(轮询发送,中断接收)

    Ⅰ.写在前面 关注我分享文章的朋友应该知道我在前面讲述过(软件.硬件)I2C主机控制从机EEPROM的例子.在I2C通信主机控制程序是比较常见的一种,可以说在实际项目中,很多应用都会使用到I2C通信. ...

  7. STM32F10x_硬件I2C读写EEPROM(标准外设库版本)

    Ⅰ.写在前面 上一篇文章是“STM32F10x_模拟I2C读写EEPROM”,讲述使用IO口模拟I2C总线通信,对EEPROM(AT24Xxx)进行读写操作的过程. 上一篇文章主要内容:I2C协议.模 ...

  8. 浅谈 STM32 硬件I2C的使用 (中断方式 无DMA 无最高优先级)(转)

    引子 STM32的硬件I2C很多人都对它望而却步.因为很多电工都说,STM32 硬件 I2C有BUG.不稳定.死机等等……最后都使用GPIO模拟I2C. 的确,模拟I2C好用.但是在我看来在一个72M ...

  9. STM8L15X 硬件I2C调试总结

    最近接到一个项目需要使用STM8L上硬件I2C与SN3731通信,用户方是个方案商,硬件设计人员也没留测试点,直接就把板子焊了拿来了.调试时除了swio口能用所有都不能用,硬件设计大概是为了显得自己焊 ...

随机推荐

  1. linux远程开机

    它需要wakeonlan这个软件,     从何处得到它?     它的官方站是:http://sourceforge.net/projects/wake-on-lan/     如果使用rpm包可以 ...

  2. [转载]MyBatis mapper文件中的变量引用方式#{}与${}的差别

    转载自:http://blog.csdn.net/szwangdf/article/details/26714603 默认情况下,使用#{}语法,MyBatis会产生PreparedStatement ...

  3. [HEOI2013]ALO

    题目描述: 现在你拥有 n 颗宝石,每颗宝石有一个能量密度,记为 ai,这些宝石的能量 密度两两不同.现在你可以选取连续的一些宝石(必须多于一个)进行融合,设 为 ai, ai+1, …, aj,则融 ...

  4. <Redis> 入门六 主从复制方式的集群

    1.集群如何操作 现在有三台虚拟机,ip分别为100,105,106,将100作为master,其他两台作为slave 1.vim redis.conf 以前的版本是 slaveof <mast ...

  5. Servlet中的几个重要的对象(转)

    讲解四大类,ServletConfig对象,ServletContext对象.request对象,response对象 ServletConfig对象 获取途径:getServletConfig(); ...

  6. [Python3网络爬虫开发实战] 1.6.2-Tornado的安装

    Tornado是一个支持异步的Web框架,通过使用非阻塞I/O流,它可以支撑成千上万的开放连接,效率非常高,本节就来介绍一下它的安装方式. 1. 相关链接 GitHub:https://github. ...

  7. [Python3网络爬虫开发实战] 1.2.1-Requests的安装

    由于Requests属于第三方库,也就是Python默认不会自带这个库,所以需要我们手动安装.下面我们首先看一下它的安装过程. 1. 相关链接 GitHub:https://github.com/re ...

  8. python——进制间的转换

    int(string_num, n)  string_num表示某种进制的字符串,n表示string_num是什么进制数 2.8.16 进制转为10进制:使用int()或者eval() 10 进制转为 ...

  9. hadoop_exporter python版本的安装使用

    1.需要使用python pip 参考https://www.cnblogs.com/rain124/p/6196053.html python2.7.5 安装pip 1 先安装setuptools ...

  10. hadoop_exporter

    1.下载安装go 1.下载二进制包:go1.4.linux-amd64.tar.gz. 2.将下载的二进制包解压至 /usr/local目录. tar -C /usr/local -xzf go1.4 ...