NRF528xx 芯片外设常用函数与事件速查(五)-----TWI(I2C)/TWIM/SPI/SPIM
一、TWI(I2C)
nRF52840 片内集成的 TWI(两线串行总线)兼容 I2C 总线,带有 EasyDMA,可与连接到
到同一总线的多个从机设备通讯,从设备都有唯一的地址,主设备通过从设备的地址和不同的从设备通讯

(1)I2C数据传输
- 起始信号和终止信号
起始信号和终止信号是由主机产生,当SCL为高电平,SDA从高电平转向低电平表示起始信号;
当SCL为高电平,SDA从低电平转向高电平表示终止信号
![]()
- 传输字节
I2C总线每次传输只能传输一个字节,先从高位bit传输。每个字节后面必须跟一个响应位ACK or NACK
-
ret_code_t nrf_drv_twi_init(nrf_drv_twi_t const * p_instance,//I2C的实例
-------------------------------nrf_drv_twi_config_t const * p_config,//配置结构体
-------------------------------nrf_drv_twi_evt_handler_t event_handler,//事件处理回调函数
-------------------------------void * p_context)//传递给回调函数的上下文
作用:TWI(I2C)模块初始化
示例://定义TWI驱动实例
-------const nrf_drv_twi_t m_twi = NRF_DRV_TWI_INSTANCE(0);
-------NRF_DRV_TWI_INSTANCE(ID)//宏定义配置
![]()
-------const nrf_drv_twi_config_t twi_config = {
--------------.scl = TWI_SCL_M, //SCL引脚
--------------.sda = TWI_SDA_M, //SDA引脚
--------------.frequency = NRF_DRV_TWI_FREQ_400K, //TWI速率
--------------.interrupt_priority = APP_IRQ_PRIORITY_HIGH, //优先级
--------------.clear_bus_init = false//初始化期间不发送9个SCL时钟
--------};
-----------//初始化
-------err_code = nrf_drv_twi_init(&m_twi, &twi_config, twi_handler, NULL);
-------void twi_handler(nrf_drv_twi_evt_t const * p_event, void * p_context) -
void nrf_drv_twi_enable(nrf_drv_twi_t const * p_instance);
作用:使能twi模块
示例:nrf_drv_twi_enable(&m_twi); -
ret_code_t nrf_drv_twi_tx(nrf_drv_twi_t const * p_instance,//TWI实例
-----------------------------uint8_t address,//从机地址
-----------------------------uint8_t const * p_data,//发送的数据
-----------------------------uint8_t length,//数据的长度
-----------------------------bool no_stop);//不产生停止信号
作用:向从机发送数据
示例:nrf_drv_twi_tx(&m_twi, 0x50(从机地址), tx_buf, 2, false); -
ret_code_t nrf_drv_twi_rx(nrf_drv_twi_t const * p_instance,//TWI实例
-----------------------------uint8_t address,//从机地址
-----------------------------uint8_t * p_data,接收缓存
-----------------------------uint8_t length);//数据的长度
作用:接收从机数据
示例:nrf_drv_twi_rx(&m_twi, 0x50(从机地址), &buf, size); -
bool nrf_drv_twi_is_busy(nrf_drv_twi_t const * p_instance);
作用:检测TWI模块是否繁忙
示例:nrf_drv_twi_is_busy(&m_twi); -
uint32_t nrf_drv_twi_start_task_get(nrf_drv_twi_t const * p_instance, nrf_drv_twi_xfer_type_t xfer_type);
作用:当使用函数nrf_drv_twi_xfer()参数flag=NRF_DRV_TWI_FLAG_HOLD_XFER指定传输任务时
--------使用该函数获取开始传输任务寄存器地址
示例:nrf_drv_twi_start_task_get(&m_twi,NRF_DRV_TWI_XFER_TX); -
uint32_t nrf_drv_twi_stopped_event_get(nrf_drv_twi_t const * p_instance);
作用:如果使用NRF_DRV_TWI_FLAG_NO_XFER_EVT_HANDLER选项来检测停止事件时,该函数获取停止事件发生寄存器地址
示例:nrf_drv_twi_stopped_event_get(&m_twi);
EVENT
NRF_DRV_TWI_EVT_DONE,---------///< Transfer completed event.
NRF_DRV_TWI_EVT_ADDRESS_NACK, ///< Error event: NACK received after sending the address.
NRF_DRV_TWI_EVT_DATA_NACK-----///< Error event: NACK received after sending a data byte.
二、TWIM
-
nrfx_err_t nrfx_twim_init(nrfx_twim_t const * p_instance,//TWIM的实例
-----------------------------nrfx_twim_config_t const * p_config,//配置结构体
-----------------------------nrfx_twim_evt_handler_t event_handler,//事件处理回调函数
-----------------------------void * p_context);//传递给回调函数的上下文
作用:初始化TWIM模块
示例:nrfx_twim_t m_twim = NRFX_TWIM_INSTANCE(1);
--------NRFX_TWIM_INSTANCE//宏配置,跟上面twi配置一样,他们共用一个配置
-------const nrfx_twim_config_t twim_config = {
--------------.scl = TWI_SCL_M, //SCL引脚
--------------.sda = TWI_SDA_M, //SDA引脚
--------------.frequency = NRF_TWIM_FREQ_400K, //TWI速率
--------------.interrupt_priority = NRFX_TWIM_DEFAULT_CONFIG_IRQ_PRIORITY, //优先级
--------------.clear_bus_init = false//初始化期间不发送9个SCL时钟
--------};
-----------//初始化
-------err_code = nrfx_twim_init(&m_twim , &twim_config, twim_handler, NULL);
-------void twim_handler(nrf_drv_twi_evt_t const * p_event, void * p_context) -
void nrfx_twim_enable(nrfx_twim_t const * p_instance);
作用:使能TWIM模块
示例:nrfx_twim_enable(&m_twim); -
nrfx_err_t nrfx_twim_tx(nrf_drv_twi_t const * p_instance,//TWIM实例
-----------------------------uint8_t address,//从机地址
-----------------------------uint8_t const * p_data,//发送的数据
-----------------------------uint8_t length,//数据的长度
-----------------------------bool no_stop);//不产生停止信号
作用:向从机发送数据
示例:nrfx_twim_tx(&m_twim, 0x50(从机地址), tx_buf, 2, false); -
nrfx_err_t nrfx_twim_rx(nrf_drv_twi_t const * p_instance,//TWI实例
-----------------------------uint8_t address,//从机地址
-----------------------------uint8_t * p_data,接收缓存
-----------------------------uint8_t length);//数据的长度
作用:接收从机数据
示例:nrfx_twim_rx(&m_twim, 0x50(从机地址), &buf, size); -
void nrf_twim_task_trigger(NRF_TWIM_Type * p_reg, nrf_twim_task_t task);
作用: 触发twim任务
示例:nrf_twim_task_trigger(&m_twim,NRF_TWIM_TASK_STARTRX); -
uint32_t * nrf_twim_task_address_get(NRF_TWIM_Type * p_reg,
--------------------------------------------nrf_twim_task_t task);
作用:获取任务寄存器地址
示例:nrf_twim_task_address_get(&m_twim,NRF_TWIM_TASK_STARTRX); -
void nrf_twim_event_clear(NRF_TWIM_Type * p_reg, nrf_twim_event_t event);
作用:清除事件标志
示例:nrf_twim_event_clear(&m_twim,NRF_TWIM_EVENT_STOPPED); -
uint32_t * nrf_twim_event_address_get(NRF_TWIM_Type * p_reg,
-----------------------------------------nrf_twim_event_t event);
作用:获取事件寄存器地址
示例:nrf_twim_event_address_get(&m_twim,NRF_TWIM_EVENT_STOPPED); -
bool nrfx_twim_is_busy(nrfx_twim_t const * p_instance)
作用:判断twim模块是否忙碌
示例:nrfx_twim_is_busy(&m_twim);
TASK
NRF_TWIM_TASK_STARTRX -------------------------///< Start TWI receive sequence.
NRF_TWIM_TASK_STARTTX -------------------------///< Start TWI transmit sequence.
NRF_TWIM_TASK_STOP ----------------------------///< Stop TWI transaction.
NRF_TWIM_TASK_SUSPEND -------------------------///< Suspend TWI transaction.
NRF_TWIM_TASK_RESUME --------------------------///< Resume TWI transaction.
EVENT
NRF_TWIM_EVENT_STOPPED ----------------------------///< TWI stopped.
NRF_TWIM_EVENT_ERROR ------------------------------///< TWI error.
NRF_TWIM_EVENT_SUSPENDED -------------------------///< TWI suspended.
NRF_TWIM_EVENT_RXSTARTED -------------------------///< Receive sequence started.
NRF_TWIM_EVENT_TXSTARTED -------------------------///< Transmit sequence started.
NRF_TWIM_EVENT_LASTRX ---------------------------//< Byte boundary, starting to receive the last byte.
NRF_TWIM_EVENT_LASTTX --------------------------- ///< Byte boundary, starting to transmit the last byte.
三、SPI
SPI是环形总线结构,主设备发送数据给从设备,从设备必定会传一个数据回来。所以当主设备
要读取从设备数据时,也必须传一个数据过去,SPI也是高位传输

SPI总线共4种工作模式,由时钟相位CPOL和时钟极性CPHA确定
CPOL=0:SPI 总线空闲时,时钟信号为低电平。
CPOL=1:SPI 总线空闲时,时钟信号为高电平。
CPHA=0:在第 1 个时钟边沿进行数据采样。
CPHA=1:在第 2 个时钟边沿进行数据采样。


-
ret_code_t nrf_drv_spi_init(nrf_drv_spi_t const * const p_instance,//SPI的实例
-----------------------------------nrf_drv_spi_config_t const * p_config,//配置结构体
-----------------------------------nrf_drv_spi_evt_handler_t handler,//事件处理回调函数
-----------------------------------void * p_context)//传递给回调函数的上下文
作用:初始化spi
示例://定义SPI驱动实例
-------const nrf_drv_spi_t spi = NRF_DRV_SPI_INSTANCE(0);
-------NRF_DRV_SPI_INSTANCE(id)//宏定义,跟spim一样配置
![]()
-------//配置spi结构体
-------nrf_drv_spi_config_t spi_config = NRF_DRV_SPI_DEFAULT_CONFIG;
-------NRF_DRV_SPI_DEFAULT_CONFIG//默认宏配置
![]()
-------//重写spi信号连接引脚
-------spi_config.ss_pin = NRF_DRV_SPI_PIN_NOT_USED;//不使用
-------spi_config.miso_pin = SPI_MISO_PIN;//主机输入引脚
-------spi_config.mosi_pin = SPI_MOSI_PIN;//主机输出引脚
-------spi_config.sck_pin = SPI_SCK_PIN;//电平信号线
-------nrf_drv_spi_init(&spi, &spi_config, spi_event_handler, NULL)
-------void spi_event_handler(nrf_drv_spi_evt_t const * p_event,
------------------------------void * p_context) -
ret_code_t nrf_drv_spi_transfer(nrf_drv_spi_t const * const p_instance,//SPI实例
-----------------------------------uint8_t const * p_tx_buffer,//传输数据
-----------------------------------uint8_t tx_buffer_length,//传输数据长度
-----------------------------------uint8_t * p_rx_buffer,//接收数据
-----------------------------------uint8_t rx_buffer_length)//接收数据长度
作用:spi数据传输接收
示例:nrf_drv_spi_transfer(&spi, spi_tx_buf, tx_size, spi_rx_buf, rx_size) -
uint32_t nrf_drv_spi_start_task_get(nrf_drv_spi_t const * p_instance);
作用:返回spi开始传输任务地址 -
uint32_t nrf_drv_spi_end_event_get(nrf_drv_spi_t const * p_instance);
作用:返回spi结束传输事件地址
四、SPIM
-
nrfx_err_t nrfx_spim_init(nrfx_spim_t const * const p_instance,//SPIM的实例
-----------------------------nrfx_spim_config_t const * p_config,//配置结构体
-----------------------------nrfx_spim_evt_handler_t handler,//事件处理回调函数
-----------------------------void * p_context)/传递给回调函数的上下文
作用:初始化spim
示例://定义SPIM驱动实例
-------const nrfx_spim_t spi = NRFX_SPIM_INSTANCE(0);
-------NRFX_SPIM_INSTANCE(id)//宏定义配置
![]()
-------//配置spim结构体
-------nrfx_spim_config_t spi_config = NRFX_SPIM_DEFAULT_CONFIG;
-------NRFX_SPIM_DEFAULT_CONFIG//默认宏配置
![]()
-------//重写spim信号连接引脚
-------spim_config.ss_pin = NRF_DRV_SPI_PIN_NOT_USED;//不使用
-------spim_config.miso_pin = SPIM_MISO_PIN;//主机输入引脚
-------spim_config.mosi_pin = SPIM_MOSI_PIN;//主机输出引脚
-------spim_config.sck_pin = SPIM_SCK_PIN;//电平信号线
-------nrfx_spim_init(&spim, &spim_config, spim_event_handler, NULL)
-------void spim_event_handler(nrfx_spim_evt_t const * p_event,
------------------------------void * p_context) -
uint32_t nrfx_spim_start_task_get(nrfx_spim_t const * p_instance);
作用:返回spim开始传输任务地址 -
uint32_t nrfx_spim_end_event_get(nrfx_spim_t const * p_instance);
作用:返回spim结束传输事件地址







浙公网安备 33010602011771号