SPI作为从机配置:
#include "spi.h"
#include "rs485.h"
#include "uart.h"
#define RX_BUFFER_SIZE 300
#ifdef SPIA_TXRX_INT_FIFO
interrupt void spiTxFifoIsr(void)
{
SpiaRegs.SPITXBUF = 0x1234;
SpiaRegs.SPIFFTX.bit.TXFFINTCLR=1; // Clear Interrupt flag
PieCtrlRegs.PIEACK.all|=0x20; // Issue PIE ACK
}
//interrupt void spiRxFifoIsr(void)
//{
// Uint16 data;
// data = SpiaRegs.SPIRXBUF;
// SpiaRegs.SPITXBUF = data;
// uart_printf("1:%lld \r\n",(long long int)data);
//
// SpiaRegs.SPIFFRX.bit.RXFFOVFCLR=1; // Clear Overflow flag
// SpiaRegs.SPIFFRX.bit.RXFFINTCLR=1; // Clear Interrupt flag
// PieCtrlRegs.PIEACK.all|=0x20; // Issue PIE ack
//}
// 接收缓冲区
Uint16 rxBuffer[RX_BUFFER_SIZE];
Uint16 rxIndex = 0;
Uint16 receptionComplete = 0;
interrupt void spiRxFifoIsr(void)
{
Uint16 data;
Uint16 i;
data = SpiaRegs.SPIRXBUF; // 读取接收到的数据
// 检查缓冲区是否已满
if (rxIndex < RX_BUFFER_SIZE)
{
rxBuffer[rxIndex++] = data;// 存储接收到的数据
// 检查是否收到结束标志 (0x0D 0x0A)
if (rxIndex >= 2 && rxBuffer[rxIndex-2] == 0x0D && rxBuffer[rxIndex-1] == 0x0A)
{
receptionComplete = 1;
// 可以在这里添加处理完成数据的代码
// 或者设置标志让主循环处理
for(i=0;i<rxIndex;i++)
uart_printf("%lld",(long long int )rxBuffer[i]);
if(i == rxIndex){
uart_printf("\r\n");
rxIndex = 0;
i = 0;
}
}
}
else
{
// 缓冲区溢出处理
rxIndex = 0; // 重置索引(或采取其他错误处理措施)
}
// 清除中断标志
SpiaRegs.SPIFFRX.bit.RXFFOVFCLR = 1; // 清除溢出标志
SpiaRegs.SPIFFRX.bit.RXFFINTCLR = 1; // 清除中断标志
// 确认PIE中断
PieCtrlRegs.PIEACK.all |= 0x20;
}
void SPIA_INT_Init(void)
{
// 1. 使能 SPI-A 模块时钟
EALLOW; // 允许写入受保护的寄存器
SysCtrlRegs.PCLKCR0.bit.SPIAENCLK = 1; // 使能 SPI-A 时钟
EDIS; // 禁止写入受保护的寄存器
InitSpiaGpio(); // 2. 初始化 SPI-A 相关的 GPIO(MOSI/MISO/CLK/CS 等)
// 3. 配置 SPI 中断服务函数(ISR)
EALLOW; // 允许写入受保护的寄存器(PIE 向量表)
PieVectTable.SPIRXINTA = &spiRxFifoIsr; // 接收 FIFO 中断指向 spiRxFifoIsr()
// PieVectTable.SPITXINTA = &spiTxFifoIsr; // 发送 FIFO 中断指向 spiTxFifoIsr()
EDIS; // 禁止写入受保护的寄存器
// 4. 初始化 SPI 模块(复位并配置寄存器)
SpiaRegs.SPICCR.bit.SPISWRESET = 1; // 复位 SPI 模块
// 5. 配置 SPI 通信参数
SpiaRegs.SPICCR.bit.CLKPOLARITY = 0; // SPI 控制寄存器
SpiaRegs.SPICCR.bit.SPICHAR = 15; // 一次传输16位
SpiaRegs.SPICCR.bit.SPILBK = 0;
//配置 SPI 操作模式(从模式)
SpiaRegs.SPICTL.bit.CLK_PHASE = 0;
SpiaRegs.SPICTL.bit.MASTER_SLAVE = 0; // 0=Slave Mode
SpiaRegs.SPICTL.bit.TALK = 1; // 允许发送(若需双向通信)
SpiaRegs.SPICTL.bit.SPIINTENA = 1; // 使能 SPI 中断(可选)
SpiaRegs.SPISTS.all = 0x0000; // SPI 状态寄存器(清零)
SpiaRegs.SPIBRR = 0x7F; // 设置 SPI 波特率
// 6. 配置 SPI FIFO(收发缓冲区)
SpiaRegs.SPIFFTX.all = 0xC028; // 发送 FIFO 控制:
// - 使能 FIFO(SPIFFENA = 1)
// - 发送 FIFO 复位(TXFIFO = 1)
// - TX FIFO 中断触发级别 = 8
SpiaRegs.SPIFFTX.all=0xC028;
SpiaRegs.SPIFFRX.all = 0x0021 ; // 添加 RXFIFORESET=1
// - RX FIFO 中断触发级别 = 8
SpiaRegs.SPIFFCT.all = 0x00; // FIFO 数据传输延迟 = 0(立即传输)
// 7. SPI 优先级控制
SpiaRegs.SPIPRI.all = 0x0010; // 设置 SPI 中断优先级(FREE = 1,允许调试时继续传输)
// 8. 使能 SPI 模块
SpiaRegs.SPICCR.bit.SPISWRESET = 1; // 释放 SPI 复位,使能 SPI 工作
// 9. 复位 FIFO 指针
SpiaRegs.SPIFFTX.bit.TXFIFO = 1; // 发送 FIFO 复位
SpiaRegs.SPIFFRX.bit.RXFIFORESET = 1; // 接收 FIFO 复位
// 10. 使能 SPI 相关中断(PIE 和 CPU 中断)
PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // 使能 PIE(外设中断扩展模块)
PieCtrlRegs.PIEIER6.bit.INTx1 = 1; // 使能 PIE Group 6, INT1(SPIRXINTA)
PieCtrlRegs.PIEIER6.bit.INTx2 = 0; // 使能 PIE Group 6, INT2(SPITXINTA)
IER |= 0x20; // 使能 CPU INT6(SPI 中断组)
EINT; // 使能全局中断(允许 CPU 响应中断)
}
#endif
#ifndef SPI_H_
#define SPI_H_
#include "DSP2833x_Device.h" // DSP2833x 头文件
#include "DSP2833x_Examples.h" // DSP2833x 例子相关头文件
#define SPIA_TXRX_INT_FIFO
void SPIA_INT_Init(void);
#endif /* SPI_H_ */
DSP在中断中接收以0X0D 0X0A结尾的数据并返回。