SPI

/*-----------------------------------------------------------
 SPI自测程序:将SPI内部发送和接收引脚内部连接,发送-接收-检测(报告)
 ----------------------------------------------------------*/

#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"

#define CHECKNUM 512

void Init_spi();
void Init_spi_fifo();
void Spi_check();
void error();

void main()
{
    InitSysCtrl();

    EALLOW;
    GpioCtrlRegs.GPAMUX2.bit.GPIO16=1;
    GpioCtrlRegs.GPAMUX2.bit.GPIO17=1;
    GpioCtrlRegs.GPAMUX2.bit.GPIO18=1;
    GpioCtrlRegs.GPAMUX2.bit.GPIO19=1;      //设置SPI功能引脚
    EDIS;

    DINT;
    IER=0x0000;
    IFR=0x0000;                     //禁止CPU中断并清除所有的中断标志位
    InitPieCtrl();
    InitPieVectTable();

    Init_spi();
    Init_spi_fifo();

    for(;;)
        Spi_check();

}

void Init_spi()
{
    SpiaRegs.SPICCR.all=0x000f;         //复位,上升沿有效,16位数据长度
    SpiaRegs.SPICTL.all=0x0006;         //主模式,使能发送,SPI禁止中断
    SpiaRegs.SPIBRR=0x007f;             //波特率控制位,波特率=LSPCLK(即37.5MHz)/(SPIBRR+1)
    SpiaRegs.SPICCR.all=0x009f;         //自循环模式使能,SPI准备接收或发送
    SpiaRegs.SPIPRI.bit.FREE=1;         //自由运行,这一行可省

}

void Init_spi_fifo()
{
    SpiaRegs.SPIFFTX.all=0xe040;        //使能FIFO且开始接收或发送数据,禁止TX FIFO中断且清除之前的发送中断标志位
    SpiaRegs.SPIFFRX.all=0x204f;        //同上,如禁止RX FIFO且清除之前的接收中断标志位
    SpiaRegs.SPIFFCT.all=0;             //无延迟

}

void Spi_check()
{
    Uint16 senddata,receiveddata;

    for(senddata=0;senddata<CHECKNUM;senddata++)
    {
        SpiaRegs.SPITXBUF=(senddata&0xff);

        while(SpiaRegs.SPIFFRX.bit.RXFFST!=1)   {}  //等待数据接收:当接收FIFO为空时,一直等待(即{}),直到有1个字接收完毕。
        receiveddata=SpiaRegs.SPIRXBUF;
        if(receiveddata!=senddata)
            error();
    }
}

void error()
{
    asm("ESTOP0");              //错误产生,程序停止
    for(;;);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值