使用USBee Suite逻辑分析仪检测基于ESP8266 NONOS SDK硬件SPI与Max7219点阵屏通信的记录

前言

注:本文为业余爱好者记录帖,仅作参考

手里有个吃灰已久的NodeMCU开发板,核心为Esp8266-12F,另有一个由4块8x8规格小屏级联而成的点阵屏,驱动芯片为Max7219;此前利用开发板通过模拟SPI驱动点阵屏使用, 最近尝试通过Esp8266硬件SPI去驱动Max7219并最终成功实现。在此,将折腾Esp8266 NONOS SDK硬件SPI过程中的发现,做一个记录。

硬件条件及环境

主要硬件:逻辑分析仪、基于esp8266的NodeMCU开发板、4块级联的max7219点阵屏

固件版本:ESP8266_NONOS_SDK-3.0.5      2267ca89fedbc0291275f9013a46874ab381315a

技术手册:ESP8266 技术参考手册_v1.7        2020.09 版

系统/软件环境:Windows 7、USBee Suite

通信分析

一. Max7219串行寻址模式

根据Max7219官方手册,要驱动Max7219,有两点要注意

1. 对于MAX7219,从DIN输入的串行数据以16位数据包形式,在CLK的每个上升沿移入内部16位移位寄存器,与LOAD/CS 的状态无关。数据在LOAD/CS的上升沿锁存至位寄存器或控制寄存器。LOAD/CS必须在第16个时钟的上升沿或其之后,且在下一时钟的上升沿之前置为高电平,否则数据将丢失。数据位用D0至D15表示,D8至D11包含寄存器地址,D0至D7包含数据,首先收到的数据是D15,即最高有效位(MSB)。

2. DIN端的数据通过移位寄存器,并经过 16.5个时钟周期后出现在DOUT,数据在CLK的下降沿移出。例如 4片MAX7219级联在一起,要向第4片写入数据时,则发送相应的16位数据,然后发送3个空操作码。当LOAD/CS置高时,数据锁存到所有器件。前3片收到的是空操作命令,第4片则收到相应的数据。

结合以上两点,要驱动4片级联的Max7219,只要在每次LOAD/CS的上升沿锁存前,连续发送四个【地址 + 数据】格式的数据包(共8字节)即可。这个利用模拟SPI比较容易实现。

二. Esp8266  NONOS SDK硬件SPI

ESP8266 封装中集成的是 Tensilica L106 超低功耗32位微型MCU,其硬件SPI翻转速率远超软件所模拟的SPI。根据官方技术手册,ESP8266硬件SPI在初始化及引脚定义后,将通过以下主机模式接口函数进行数据传输

int SPIMasterSendData(SpiNum spiNum, SpiData* pinData)

SPI传输数据的结构体定义如下:

/**
*@brief SPI data package
*/
typedef struct {
    uint16_t    cmd;              ///< Command value
    uint8_t     cmdLen;           ///< Command byte length
    uint32_t    *addr;            ///< Point to address value
    uint8_t     addrLen;          ///< Address byte length
    uint32_t    *data;            ///< Point to data buffer
    uint8_t     dataLen;          ///< Data byte length.
} SpiData;

可见,结构体变量成员的关系为【数据,数据长度】的形式。

手册中列举的 SPI 特点中,此次要关注的有几点
• 支持标准的主机(Master)和从机(Slave)模式。
• 支持长度可编程的硬件指令(CMD)和地址(ADDR),指令最长 16 位,地址最长 64 位。
• 数据缓冲区最长 64 字节,以 word 对齐。
• 可选的 MSB(最高有效位)和 LSB(最低有效位)传输。
• 可选的数据缓冲区高字节或低字节传输。

官方定义的以字节为单位的常规 SPI 通信格式如下:
ESP8266 SPI 主机通信格式为 命令 + 地址 + 读/写数据,具体为:
命令:必须存在;长度,1 ~ 16 位;主机输出从机输入(MOSI)。
地址:可选;长度,0 ~ 32 位;主机输出从机输入(MOSI)。
数据写或读:可选;长度,0 - 512 位(64 字节);主机输出从机输入(MOSI)或主机输入从机输出(MISO)

官方技术手册列举了由两个8266作SPI主从通信的例子。要驱动max7219,只需解决如何利用官方的接口函数和主机通信格式,构造符合从机Max7219通信要求的数据包即可。

三. 测试及采样

此次测试的主要任务,就是弄清楚函数 SPIMasterSendData() 在数据传输时的具体情况。由于硬件条件有限,为保证分析时采样的准确性且不误码,测试时 ESP8266 硬件SPI的时钟频率配置为 2MHz,USBee Suite 逻辑分析仪的采样率设置为 4M,采样深度 20M。通过设定一个1秒的定时器,重复调用接口函数 SPIMasterSendData() 发送数据,以便逻辑分析仪采集数据信号。

1. 测试数据1及采样截图

unsigned int data_cmd = 0x0102;
unsigned int data_addr = 0x0304;
unsigned int data_data = 0x05060708;

sendData.cmd = data_cmd;
sendData.cmdLen = 2;
sendData.addr = &data_addr;
sendData.addrLen = 2;
sendData.data = &data_data;
sendData.dataLen = 4;
SPIMasterSendData(SpiNum.HSPI, &sendData);

测试1的采样中,由cmd、data传输的字节内容完整,但高低字节顺序颠倒;由addr传输的2个有效字节,在发送时丢失,变成了2个0x00字节。

2. 测试数据2及采样截图

unsigned int data_cmd = 0x0102;
unsigned int data_addr = 0x030405;
unsigned int data_data = 0x060708;

sendData.cmd = data_cmd;
sendData.cmdLen = 2;
sendData.addr = &data_addr;
sendData.addrLen = 3;
sendData.data = &data_data;
sendData.dataLen = 3;
SPIMasterSendData(SpiNum.HSPI, &sendData);

测试2的采样中,由cmd、data传输的字节情况不变;由addr传输的3个有效字节,在发送时变成了1个0x00字节+2个有效字节,字节0x05丢失。

3. 测试数据3及采样截图

unsigned int data_cmd = 0x0102;
unsigned int data_addr = 0x03040506;
unsigned int data_data = 0x0708;

sendData.cmd = data_cmd;
sendData.cmdLen = 2;
sendData.addr = &data_addr;
sendData.addrLen = 4;
sendData.data = &data_data;
sendData.dataLen = 2;
SPIMasterSendData(SpiNum.HSPI, &sendData);

测试3的采样中,由cmd、data传输的字节情况不变;由addr传输的4个有效字节,在发送时传输内容完整。

分析结论

前文提到,ESP8266 封装中集成的是 Tensilica L106 超低功耗32位微型MCU,那么在32位系统中,一个字(word)是4字节(byte)。

通过对比测试1~3的采样图,发现接口函数 SPIMasterSendData() 在数据传输时,结构体变量的成员cmd、data、addr遵循以下规则:

cmd 先发送 word 的低字节
addr 先发送 word 的高字节
data 先发送 word 的低字节

测试1、2中,addr在数据发送时之所以出现有效字节丢失的情况,是因为addr是按4字节对齐处理数据的,当addr指针指向的数据不足4字节,会按字(word)即4字节补齐,然后根据结构体变量中成员【数据,数据长度】的对应关系,由高字节开始传输设定的数据长度。因此,当addr要发送的数据小于4字节,而addr在发送数据时高字节在前,就会出现补充的0x00高字节挤占了有效字节的数据长度,造成数据丢失。

题外话:在分析通信时,逻辑分析仪是个不错的帮手。 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值