Nordic52810入门篇-TWIM串行总线

一、前言

TWI(Two wire Serial Interface):twi接口是对I2C总线接口的继承和发展,完全兼容I2C总线

Nordic的TWI外设主要分成两类,TWIM(基于EasyDMA的主设备Master) TWIS(基于EasyDMA的从设备Slave)
ps:如有错误,请留言指正,谢谢

二、工作原理

功能特点

  • 兼容I2C总线
  • 可选速率 100kbps/250kbps/400kbps
  • EasyDMA进行RAM数据与寄存器的传输
  • 可映射到任意的GPIO引脚

原理框图
在这里插入图片描述

一主多从应用案例
TWI主机可同时挂载多个从机,主机通过从机唯一分配的地址进行寻址访问,总线需加上拉电阻以保证其驱动能力
在这里插入图片描述

数据通信过程

写数据

  • TWI主机写数据通过STARTTX任务进行触发,最终通过STOP结束任务
  • 从机的地址寻址成功后,通过TXD.PTR寄存器指向的RAM地址,调制发送数据
  • 发送时可被SUSPEND任务挂起,挂起期间总线会保持,在生效RESUME任务后可继续通信
  • 当发送最后一个字节时,TWIM会产生一个LASTTX事件,必须发出STOP任务结束一次通信(不会自动停止总线通信)
  • 仅通信RESUME释放后才能发送STOP任务

在这里插入图片描述

读数据

  • TWI主机读数据通过STARTRX 任务触发,通过STOP借结束任务
  • 读取到的数据将储存到RXD.PTR寄存器指向的RAM地址中,数据接收完成后主机产生一个NACK
  • 挂起任务SUSPEND触发后,将会产生一个SUSPENDED事件,此事件可用于同步软件
  • 当TWI主机准备接收最后一个字节时,会产生一个LASTRX事件
  • TWI master在被挂起时无法停止,因此必须在TWI master恢复后发出STOP任务

在这里插入图片描述

三、寄存器

  • SHORTS:循环模式控制,写1使能发送/接收最后字节的LASTTX/LASTRX事件后,自动触发如开启/挂起/结束任务
  • INTEN:中断控制寄存器,写1使能中断,写0禁用中断(按位配置中断STOPPED/ERROR/SUSPENDED/RXSTARTED/TXSTARTED/LASTRX/LASTTX
  • INTENSET:中断使能寄存器,写1有效
  • INTENCLR:中断禁用寄存器,写1有效
  • ERRORSRC:错误状态寄存器,写1清状态
  • ENABLE:TWIM外设使能寄存器
  • PLSEL.SCL:关联SCL时钟引脚,低4位有效
  • PLSEL.SDA:关联SDA数据引脚,低4位有效
  • FREQUENCY:TWI通信速率选择 100k 250k 400k
  • RXD.PTR:接收数据寄存器,指向RXD接收缓存
  • RXD.MAXCNT:接收数据缓存区最大长度
  • RXD.AMOUNT:最近一次数据通信的接收传输字节长度
  • RXD.LIST:EasyDMA列表类型,写1使用arraylist接收缓存,触发START任务时无需更新PTR数据指针寄存器,类似DMA串口中双缓存循环读取
  • TXD.PTR:发送数据寄存器,指向TXD发送缓存
  • TXD.MAXCNT:需要发送数据缓存的最大长度
  • TXD.AMOUNT:最近一次数据通信的发送传输字节长度
  • TXD.LIST:EasyDMA列表类型,写1使用arraylist发送缓存,触发START任务时无需更新PTR数据指针寄存器,类似DMA串口中双缓存循环发送
  • ADDRESS:TWI总线的寻址地址,最低位为读写位

四、相关接口

SPIM的驱动目录在modules\nrfx\drivers\src\nrfx_twim.c

  • nrfx_twim_init:初始化twim,形参nrfx_twim_config_t p_config传入引脚的映射关系与TWI的参数(通信速率、中断优先级);函数指针nrfx_twim_evt_handler_t handler用于定义事件回调(数据的发送与接收)
nrfx_err_t nrfx_twim_init(nrfx_twim_t const *        p_instance,
                          nrfx_twim_config_t const * p_config,
                          nrfx_twim_evt_handler_t    event_handler,
                          void *                     p_context)
  • nrfx_twim_uninit:禁用twim外设,系统进入低功耗的时候可以调用
void nrfx_twim_uninit(nrfx_twim_t const * p_instance)
  • nrfx_twim_xfer:数据传输接口,形参nrfx_twim_xfer_desc_t const * p_xfer_desc定义了发送TX与接收RX的缓存与长度
nrfx_err_t nrfx_twim_xfer(nrfx_twim_t           const * p_instance,
                          nrfx_twim_xfer_desc_t const * p_xfer_desc,
                          uint32_t                      flags)

五、代码实例

打开工程目录 examples\peripheral\twi_master_with_twis_slave.eww,选择pca10040

贴上例程代码

/*
* 初始化TWI master
*/
static ret_code_t twi_master_init(void)
{
    ret_code_t ret;
    const nrf_drv_twi_config_t config =
    {
       .scl                = TWI_SCL_M,//选择pin脚
       .sda                = TWI_SDA_M,
       .frequency          = NRF_DRV_TWI_FREQ_400K,//通信速率
       .interrupt_priority = APP_IRQ_PRIORITY_HIGH,//优先级
       .clear_bus_init     = false
    };

    ret = nrf_drv_twi_init(&m_twi_master, &config, NULL, NULL);//调用配置驱动

    if (NRF_SUCCESS == ret)
    {
        nrf_drv_twi_enable(&m_twi_master);//使能总线
    }

    return ret;
}

/*
* main接口,程序主要是通过软件模拟了从机与主机的通信
*/
int main(void)
{
    ret_code_t err_code;
    bool epprom_error = 0;
    /* Initialization of UART */

    bsp_board_init(BSP_INIT_LEDS);

    APP_ERROR_CHECK(NRF_LOG_INIT(NULL));

    /* Initializing simulated EEPROM */
    err_code = eeprom_simulator_init();//模拟eeprom twis从机总线初始化
    APP_ERROR_CHECK(err_code);

    /* Initializing TWI master interface for EEPROM */
    err_code = twi_master_init();//主机twim总线初始化
    APP_ERROR_CHECK(err_code);

    err_code = nrf_drv_clock_init();//时钟初始化
    APP_ERROR_CHECK(err_code);
    nrf_drv_clock_lfclk_request(NULL);

    err_code = app_timer_init();//定时器初始化
    APP_ERROR_CHECK(err_code);

    nrf_drv_uart_config_t uart_config = NRF_DRV_UART_DEFAULT_CONFIG;//串口配置,可以使用串口命令行控制
    uart_config.pseltxd = TX_PIN_NUMBER;
    uart_config.pselrxd = RX_PIN_NUMBER;
    uart_config.hwfc    = NRF_UART_HWFC_DISABLED;
    err_code = nrf_cli_init(&m_cli_uart, &uart_config, true, true, NRF_LOG_SEVERITY_INFO);
    APP_ERROR_CHECK(err_code);

    err_code = nrf_cli_start(&m_cli_uart);//开启命令行cli控制
    APP_ERROR_CHECK(err_code);

    /* Welcome message */
    NRF_LOG_RAW_INFO(
            "TWIS and TWI usage example started.\r\n"
            "You can access simulated EEPROM memory using <eeprom> command.\r\n"
            "Execute: <eeprom -h> for more information or press the Tab button "
            "to see all available commands.\r\n"
    );

    /* Main loop */
    while (1)
    {
        UNUSED_RETURN_VALUE(NRF_LOG_PROCESS());
        nrf_cli_process(&m_cli_uart);//处理串口命令

        if (epprom_error != eeprom_simulator_error_check())//错误状态查询
        {
            epprom_error = eeprom_simulator_error_check();
            if (epprom_error != 0)
            {
                NRF_LOG_RAW_INFO(
                        "WARNING: EEPROM transmission error detected.\r\n"
                        "Use 'x' command to read error word.\r\n"
                );
            }
        }
    }
}
### 回答1: nrf52810开发指南-上册.pdf是一本非常详细的指南,可以帮助人们更好地了解和学习nrf52810无线芯片的开发和使用方法。该指南主要介绍了nrf52810的基本特性、硬件架构、软件开发环境、开发工具、编程语言、开发流程等方面的内容。 该指南以实例讲解的方式,详细介绍了如何使用nrf52810从事无线应用程序的开发。具体而言,该指南介绍了如何使用Keil MDK、IAR Embedded Workbench、SEGGER Embedded Studio等IDE工具,以及nrf5 SDK和nrf5x Command Line Tools等开发工具进行开发。 另外,该指南还分析了nrf52810在无线通讯中的应用场景,包括基于Bluetooth Low Energy(BLE)的智能家居、可穿戴设备等领域。通过实践和案例演示,读者能够深入了解nrf52810芯片的广泛应用前景。 总之,nrf52810开发指南-上册.pdf是一份非常有价值的指南,对于无线产品开发者和爱好者都有非常大的帮助,值得一读。 ### 回答2: nrf52810是Nordic公司最新推出的低功耗蓝牙芯片,它采用ARM Cortex-M4处理器,拥有256KB的闪存和24KB的RAM,非常适合开发低功耗蓝牙设备。该芯片还支持Nordic公司自主开发的S132 SoftDevice协议栈,可以实现BLE4.2和BLE5.0的各种特性,如长包、扫描窗口等。 该开发指南共分为六个章节,第一章介绍了nrf52810芯片的主要特点,第二章讲解了如何使用开发板进行测试与调试,第三章介绍了如何使用nRF5 SDK和nRF5 SoftDevice进行开发,第四章讲解了如何使用Nordic公司的开发工具nRF Connect和Segger J-Link进行开发,第五章讲解了如何进行定制化开发,第六章则是常见问题解答与扩展阅读。 通过阅读该开发指南,开发者可以快速了解nrf52810芯片的各项特性,掌握开发与调试技巧,并且学会如何利用Nordic公司的各种开发工具进行开发。此外,该指南还提供了大量的编程示例和实验框图,可以帮助开发者快速上手并深入理解nrf52810的开发流程。 总之,nrf52810开发指南为开发低功耗蓝牙设备的开发者提供了全面且实用的开发指导,是一本非常优秀的开发书籍,值得大家阅读。 ### 回答3: nRF52810开发指南-上册是针对nRF52810芯片的开发指南,该芯片是由北欧半导体公司推出的低功耗蓝牙SoC芯片。本开发指南针对该芯片的主要功能特点和应用场景,提供了全面的技术说明和具体实践操作指引。 一方面,本开发指南详细介绍了nRF52810芯片的硬件架构和软件框架,包括CPU核心、内存、外设、通信接口等方面的详细说明,同时还介绍了nRF52810芯片的功耗特点和低功耗技术实现方法。这些内容对于硬件工程师和软件工程师来说都是非常重要的,可以帮助他们在设计和开发过程中更好地了解和掌握nRF52810芯片的内部结构和工作原理。 另一方面,本开发指南还提供了丰富的样例程序和实践案例,包括基于SDK的应用程序设计、BLE服务设计、无线OTA升级、传感器数据采集和处理等方面的实现方法和具体代码。这些实践案例不仅可以帮助读者更好地理解nRF52810芯片的使用方法和应用场景,还可以为实际应用开发提供有参考价值的实践经验。 总之,nRF52810开发指南-上册是一份非常优秀的技术文档,对于从事低功耗蓝牙应用开发的工程师和科研人员来说都是非常有价值的。它详细介绍了nRF52810芯片的设计和开发方法、低功耗技术实现方案,并提供了多个实践案例和具体的应用程序设计,为读者提供了全面且实用的技术指导。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值