【雅特力AT32F435ZMT-STB 开发板评测】-SPI接口评测
雅特力AT32F435ZMT-STB V1.0 SPI接口
开发板:雅特力AT32F435ZMT-STB V1.0
开发环境:RT-Thread studio V2.2.6
RT-Thread版本:5.0.0
SPI外设资源:SCK--PA5,SDA—PA7,MSIO—PA6
测试对象:中景园1.8吋TFT LCD,驱动IC:ST7735
雅特力AT32F435ZMT片内集成多达4个SPI接口,在从或主模式下,全双工和半双工的通信速率可达36兆位/秒。3位的预分频器可产生8种主模式频率,可配置成每帧8位或16位。硬件的CRC产生/校验支持基本的SD卡、MMC、和SDHC模式。所有的SPI接口都可以使用DMA操作。SPI接口可配置为TI模式工作,用于主模式和从模式的通信。 内部结构如图1所示。
图1 SPI结构框图
主要特性:
― 全双工同步通信( 可以选择全双工只收以此释放用于发送的IO) ;
― 半双工同步通信( 可以根据软件编程配置选择传输方向:发送或接收) 。
- 可编程配置主/从模式。
- 可编程配置的CS 信号处理方式:
― 硬件处理CS;
― 软件处理CS。
- 可编程配置的8 位或16 位帧位数。
- 可编程配置的通信频率以及分频系数(最大分频系数为fPCLK/2) 。
- 可编程配置的时钟极性和相位。
- 可编程配置的数据传输顺序(先发MSB/LSB)。
- 可编程配置的错误中断标志(CS脉冲异常,接收器溢出错误,主模式错误,CRC校验错误) 。
- 可编程配置的发送数据缓冲器空中断以及接收数据缓冲器满中断。
- 支持DMA 发送和接收。
- 支持硬件CRC 发送和校验。
- 具备通信忙标志。
- 兼容TI 协议。
- 新建工程
见文章雅特力AT-START-F435开发板试用】1-构建RTT-Stdio开发环境 - 国产芯片交流 - 电子工程世界-论坛 (eeworld.com.cn)
- 配置SPI
在左侧项目资源管理器中打开新建的项目,按图2双击RT-Tread Setting设置项,按图3完成相关项设置。
图2 驱动设置
图3 设置SPI1配置项
- 添加LCD驱动程序,修改SPI引脚号
直接采用中景园提供LCD驱动程序,将bsp_display.c、bsp_display.h、oledfont.h、zk.c四个文件添加到工程中,打开bsp_display.h,修改SPI引脚号如下:
#define LCD_RST_PIN GET_PIN(C, 0) //PC0
#define LCD_DC_PIN GET_PIN(C, 1) //PC1
#define LCD_BLK_PIN GET_PIN(C, 2) //PC2
#define LCD_SCL_PIN GET_PIN(A, 5) //PA5
#define LCD_SDI_PIN GET_PIN(A, 7) //PA7
#define LCD_CS_PIN GET_PIN(A, 4) //PA4
#define LCD_MISO_PIN GET_PIN(A, 6) //定义MISO引脚为PA6
#define ZK_CS_PIN GET_PIN(A, 9) //定义字库片选CS引脚为PA9
注:这款LCD带汉字库芯片。
添加头文件:
#include <DRV_GPIO.h>
#include <pin.h>
打开main.c文件,添加以下三个头文件:
#include "drv_gpio.h"
#include "bsp_display.h"
#include <drv_spi.h>
#include <spi.h>
- 添加路径
图4 设置新增头文件路径
按照图4步骤分别添加bsp_display.h、drv_spi.h所在目录路径:
“..\AT32F435\rt-thread\components\drivers\include\drivers”
“..\AT32F435\rt-thread\components\drivers\spi”
“..\AT32F435\bsp”
- 修改程序
LCD显示程序,增加以下代码段,打开bsp_display.c,在前面添加:
#define SPI1_BUS_NAME "spi1"
#define SPI1__DEVICE_NAME "spi10"
#define SPI1_NCS_PIN 29
#define BACK_COLOR WHITE
static void LCD_WR_Byte(uint8_t dat, uint8_t mode);
struct n32_hw_spi_cs
{
uint32_t GPIO_Pin;
};
struct rt_spi_device *st7735_spi_dev;
int rt_hw_spi_config(void);
在程序最后添加:
int rt_hw_spi_config(void)
{
static struct n32_hw_spi_cs spi_cs1;
static struct rt_spi_device spi_dev_lcd ;
rt_err_t res;
spi_cs1.GPIO_Pin = GET_PIN(A,4);
rt_pin_mode(LCD_CS_PIN, PIN_MODE_OUTPUT);
res = rt_spi_bus_attach_device(&spi_dev_lcd, SPI1__DEVICE_NAME, SPI1_BUS_NAME, (void*)&spi_cs1);
if (res != RT_EOK)
{
rt_kprintf("rt_spi_bus_attach_device!\r\n");
return res;
}
spi_dev_lcd.bus->owner = &spi_dev_lcd;
{
struct rt_spi_configuration cfg;
rt_kprintf("rt_spi OK!\r\n");
cfg.data_width = 8;
cfg.mode = RT_SPI_MODE_3 | RT_SPI_MSB ;
cfg.max_hz = 40*1000 *1000; /* 40M,SPI max 42MHz, 3-wire spi */
if(spi_dev_lcd.bus->owner==RT_NULL)
{
rt_kprintf("RT_OK\r\n");
}
rt_kprintf("owner= %d\r\n",*spi_dev_lcd.bus->owner);
res = rt_spi_configure(&spi_dev_lcd, &(cfg));
if(res != RT_EOK)
{
rt_kprintf("configure spi1 ERR!\r\n");
}
}
st7735_spi_dev = (struct rt_spi_device *)rt_device_find(SPI1__DEVICE_NAME);
if(!&st7735_spi_dev)
{
rt_kprintf("spi1 test run failed! can't find %s device!\n", SPI1__DEVICE_NAME);
}
return RT_EOK;
}
INIT_DEVICE_EXPORT(rt_hw_spi_config);
打开main.c,在int main中添加如下程序段:
LCD_Clear(WHITE);
Display_Asc_String(1,1,4," ", WHITE); //光标定位
Display_GB2312_String(30,10,2,"欢迎参与",RED);
Display_GB2312_String(15,30,3,"雅特力",BLUE);
Display_Asc_String(10,60,5,"EEWORLD",BLUE);
Display_Asc_String(10,90,4,"AT32F435ZMT",BRED);
Display_GB2312_String(30,120,2,"评测活动",RED);
至此修改工作全部结束,编译下载运行。
系统运行结果如图5:
图5 系统运行界面
由以上例子我们可以看出,SPI总线运行正常,数据传送正确。在《雅特力AT32F435ZMT-STB 开发板》上利用Rt-thread进行二次开发很方便,用户上手较容易。