采用DSP-TI TMS320F2812,应用其SPI接口,以查询方式实现低电平点亮LED循环显示数字“0~9”功能,SPI配置为上升沿无延时发送,数据长度为8位,波特率最小值,给出C语言完整代码
时间: 2024-05-08 16:18:25 浏览: 214
TMS320F2812的SPI接口设计
以下是使用DSP-TI TMS320F2812实现SPI接口、低电平点亮LED循环显示数字“0~9”的C语言完整代码:
```c
#include "DSP281x_Device.h"
#include "DSP281x_Examples.h"
#define LED_CNT 10
#define SPI_MSG_SIZE 1
// 定义数字0~9的LED点亮模式,低电平点亮
const Uint16 LED_PATTERN[LED_CNT] = {
0x0C00,
0xFC00,
0x9C00,
0xCC00,
0x6C00,
0xCC00,
0xDC00,
0x8C00,
0xFC00,
0xEC00
};
void spi_init()
{
EALLOW;
// 使能SPI时钟
SysCtrlRegs.PCLKCR0.bit.SPI_A = 1;
// SPI复位
SpiaRegs.SPICCR.bit.SPISWRESET = 0;
// SPI配置为主设备,16位数据长度,SPI时钟频率为最小值
SpiaRegs.SPICCR.bit.CLKPOLARITY = 1;
SpiaRegs.SPICCR.bit.SPILBK = 0;
SpiaRegs.SPICCR.bit.SPICHAR = 15;
SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;
SpiaRegs.SPICTL.bit.TALK = 1;
SpiaRegs.SPICTL.bit.CLK_PHASE = 0;
SpiaRegs.SPIBRR = 0;
SpiaRegs.SPICCR.bit.SPISWRESET = 1;
EDIS;
}
void spi_write(Uint16 data)
{
// 等待SPI空闲
while (SpiaRegs.SPISTS.bit.BUFFULL_FLAG);
// 发送数据
SpiaRegs.SPITXBUF = data;
}
void main(void)
{
// 初始化系统时钟
InitSysCtrl();
// 初始化SPI接口
spi_init();
// 初始化GPIO,用于控制LED
EALLOW;
GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO28 = 1;
EDIS;
Uint16 i = 0;
while (1)
{
// 发送数字对应的LED点亮模式
for (i = 0; i < LED_CNT; i++)
{
spi_write(LED_PATTERN[i]);
DELAY_US(1);
}
// 延时
DELAY_US(100000);
}
}
```
在该程序中,我们先定义了数字0~9对应的LED点亮模式,然后在主程序中使用SPI接口依次发送这些模式,从而实现循环显示数字的功能。LED的控制使用了GPIO,每发完一个数字就延时一段时间,然后再发下一个数字。程序中的所有IO口和SPI接口配置都是基于TMS320F2812的数据手册进行设置的,具体细节可以参考手册。
阅读全文