DSPF28335 SPI模式配置作为

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结尾的数据并返回。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值