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
请按照以下步骤操作构建并运行该示例:
打开工程文件。
按照 快速入门 中 编译APP Image 给出的步骤构建目标文件。
编译成功后,在路径
mdk\bin
或gcc\bin
下会生成 app binapp_MP_xxx.bin
文件。按下复位按键,开始运行。
测试验证
EVB启动后,打印获取到的ID信息。若ID为0x3e和0x01(仅代表PWM3610DM-SUDU鼠标),代表测试成功。
id[0] = 0x3e, id[1] = 0x01 SPI3W test pass!
代码介绍
该章节分为以下几个部分:
源码路径
工程路径:
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_init
和 driver_spi3wire_init
。
board_spi3wire_init
中包含了PAD与PINMUX设置。
配置PAD:设置引脚、PINMUX模式、PowerOn、无内部上拉。
配置PINMUX:配置引脚P2_2为SPI2W_CLK功能、P2_3为SPI2W_DATA功能、P2_4为SPI2W_CS功能。
driver_spi3wire_init
包含了对spi3wire外设的初始化。
使能PCC时钟。
设置SPI3WIRE输出时钟。
设置工作模式为三线模式。
设置读取数据的延时时间。
设置输出不产生延时。
设置三线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;
功能实现
三线SPI的信号同步。设置resync时间,发送resync信号,等待resync信号输出完毕后失能resync信号。
SPI3W_SetResyncTime(2);
SPI3W_ResyncSignalCmd(ENABLE);
while (SPI3W_GetFlagStatus(SPI3W_FLAG_RESYNC_BUSY) == SET);
SPI3W_ResyncSignalCmd(DISABLE);
执行
SPI3W_Cmd()
函数,使能三线SPI功能。执行
spi3wire_readbyte
函数,读取鼠标ID。等待busy状态标志位消除。
清除SPI3WIRE的接收FIFO中数据。
通过SPI3WIRE读取传入参数地址下的一个数据,等待busy状态标志位消除。
读取SPI3WIRE接收FIFO中数据。
返回读取的数据并打印。
/* 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(®_value, 1);
return reg_value;