由于nRF51822与模块之间通过IIC总线通信,在解决问题的时候学习了TWI,现在将其总结一下。
TWI(Two-wire interface),即两线通信接口,也就是我们平时常说的IIC接口。
IIC串行总线一般有两根信号线,一根是双向数据线SDA,另一根是时钟线SCL。所有接到IIC总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。
以下是在百科上找到的关于IIC工作的硬件原理:总线的运行(数据传输)由主机控制。所谓主机是指启动数据的传送(发出启动信号)、发出时钟信号以及传送结束时发出停止信号的设备,通常主机都是微处理器。被主机寻访的设备称为从机。为了进行通讯,每个接到I2C总线的设备都有一个唯一的地址,以便于主机寻访。主机和从机的数据传送,可以由主机发送数据到从机,也可以由从机发到主机。凡是发送数据到总线的设备称为发送器,从总线上接收数据的设备被称为接受器。
TWI初始化
1、由手册可知,TWI信号线可在GPIO口中任意选择映射,并单独配置。因此,在初始化最开始的时候还是GPIO口的初始化。
以前在写关于nRF51822的学习笔记的时候,并没有详细介绍GPIO口的配置,在这里说明一下。
nRF51822总共有32个GPIO口,每一个GPIO口都可以通过PIN_CNF[n]单独配置。
一般配置如下方面:
一般GPIO口的配置都是通过PIN_CNF[n]寄存器的设置来实现的,在nRF51822中都可以通过相关的库函数来实现,现在介绍一下PIN_CNF[n]寄存器。
1 | DIR | INPUT | 0 | 输入引脚 |
方向 | OUTPUT | 1 | 输出引脚 | |
2 | INPUT | CONNECT | 0 | 连接输入缓冲器 |
输入缓冲 | DISCONNECT | 1 | 无连接输入缓冲器 | |
3 | PULL | DISABLED | 0 | 无上下拉 |
PULLDOWN | 1 | 下拉模式 | ||
上下拉模式 | PULLUP | 2 | 上拉模式 | |
4 | DRIVE | S0S1 | 0 | Standard 0、Standard1 |
H0S1 | 1 | High drive0、Standard1 | ||
驱动模式 | S0H1、H0H1、D0S1、D0H1、S0D1、H0D1 | 2--7 | …… | |
5 | SENSE | DISABLED | 0 | 无 |
HIGH | 1 | 高电平敏感 | ||
敏感机制 | LOW | 2 | 低电平敏感 |
static __INLINE void nrf_gpio_cfg_input(uint32_t pin_number, nrf_gpio_pin_pull_t pull_config)
{
/*lint -e{845} // A zero has been given as right argument to operator '|'" */
NRF_GPIO->PIN_CNF[pin_number] = (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos)
| (GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos)
| (pull_config << GPIO_PIN_CNF_PULL_Pos)
| (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_