Polling

该示例通过使用 SPI3WIRE 的Polling方式读取鼠标ID信息。

环境需求

该示例支持以下开发套件:

开发套件

Hardware Platforms

Board Name

RTL87x2G HDK

RTL87x2G EVB

更多信息请参考 快速入门

硬件连线

EVB外接PWM3610DM-SUDU鼠标,连接P2_2和CLK,P2_3和SDIO,P2_4和CS#,同时连接GND和VDD。

硬件介绍

PWM3610DM-SUDU为激光鼠标传感器模块。PMW3610DM-SUDU寄存器可通过串行端口访问。寄存器用于读取运动数据和状态,以及设置设备配置。在此示例中,用于演示与SPI3W的通信。

编译和下载

该示例的工程路径如下:

Project file: samples\peripheral\spi3wire\polling\proj\rtl87x2g\mdk

Project file: samples\peripheral\spi3wire\polling\proj\rtl87x2g\gcc

请按照以下步骤操作构建并运行该示例:

  1. 打开工程文件。

  2. 按照 快速入门编译APP Image 给出的步骤构建目标文件。

  3. 编译成功后,在路径 mdk\bingcc\bin 下会生成 app bin app_MP_xxx.bin 文件。

  4. 按照 快速入门MPTool 给出的步骤将app bin烧录至EVB内。

  5. 按下复位按键,开始运行。

测试验证

  1. EVB启动后,打印获取到的ID信息。若ID为0x3e和0x01(仅代表PWM3610DM-SUDU鼠标),代表测试成功。

    id[0] = 0x3e, id[1] = 0x01
    SPI3W test pass!
    

代码介绍

该章节分为以下几个部分:

  1. 源码路径

  2. 初始化函数将在 初始化 章节介绍。

  3. 初始化后的功能实现将在 功能实现 章节介绍。

源码路径

  • 工程路径: sdk\samples\peripheral\spi3wire\polling\proj

  • 源码路径: sdk\samples\peripheral\spi3wire\polling\src

该工程的工程文件代码结构如下:

└── Project: polling
    └── secure_only_app
        └── Device                   includes startup code
            ├── startup_rtl.c
            └── system_rtl.c
        ├── CMSIS                    includes CMSIS header files
        ├── CMSE Library             Non-secure callable lib
        ├── Lib                      includes all binary symbol files that user application is built on
            └── rtl87x2g_io.lib
        ├── Peripheral               includes all peripheral drivers and module code used by the application
            ├── rtl_rcc.c
            ├── rtl_pinmux.c
            └── rtl_spi3w.c
        └── APP                      includes the ble_peripheral user application implementation
            ├── main_ns.c
            └── io_spi3w.c

初始化

初始化流程包括了 board_spi3wire_initdriver_spi3wire_init


board_spi3wire_init 中包含了PAD与PINMUX设置。

  1. 配置PAD:设置引脚、PINMUX模式、PowerOn、无内部上拉。

  2. 配置PINMUX:配置引脚P2_2为SPI2W_CLK功能、P2_3为SPI2W_DATA功能、P2_4为SPI2W_CS功能。


driver_spi3wire_init 包含了对spi3wire外设的初始化。

  1. 使能PCC时钟。

  2. 设置SPI3WIRE输出时钟。

  3. 设置工作模式为三线模式。

  4. 设置读取数据的延时时间。

  5. 设置输出不产生延时。

  6. 设置三线SPI为普通模式

RCC_PeriphClockCmd(APBPeriph_SPI3W, APBPeriph_SPI3W_CLOCK, ENABLE);
...
SPI3W_InitStruct.SPI3W_SysClock       = 20000000;
SPI3W_InitStruct.SPI3W_Speed          = 800000;
SPI3W_InitStruct.SPI3W_Mode           = SPI3W_3WIRE_MODE;
SPI3W_InitStruct.SPI3W_ReadDelay      = 0x3;
SPI3W_InitStruct.SPI3W_OutputDelay    = SPI3W_OE_DELAY_NONE;
SPI3W_InitStruct.SPI3W_ExtMode        = SPI3W_NORMAL_MODE;

功能实现

  1. 三线SPI的信号同步。设置resync时间,发送resync信号,等待resync信号输出完毕后失能resync信号。

SPI3W_SetResyncTime(2);
SPI3W_ResyncSignalCmd(ENABLE);
while (SPI3W_GetFlagStatus(SPI3W_FLAG_RESYNC_BUSY) == SET);
SPI3W_ResyncSignalCmd(DISABLE);
  1. 执行 SPI3W_Cmd() 函数,使能三线SPI功能。

  2. 执行 spi3wire_readbyte 函数,读取鼠标ID。

    1. 等待busy状态标志位消除。

    2. 清除SPI3WIRE的接收FIFO中数据。

    3. 通过SPI3WIRE读取传入参数地址下的一个数据,等待busy状态标志位消除。

    4. 读取SPI3WIRE接收FIFO中数据。

    5. 返回读取的数据并打印。

/* Check spi busy or not */
while (SPI3W_GetFlagStatus(SPI3W_FLAG_BUSY) == SET)
...

SPI3W_ClearRxDataLen();
SPI3W_StartRead(address, 1);

while (SPI3W_GetFlagStatus(SPI3W_FLAG_BUSY) == SET)
...

while (SPI3W_GetRxDataLen() == 0);
SPI3W_ReadBuf(&reg_value, 1);

return reg_value;