tms281x SPI的问题

2019-08-01 14:26发布

本帖最后由 okan1501 于 2014-11-22 01:19 编辑

请问程式对SPI暂存器设定的SpiaRegs.SPICCR.all = 0x8a
D0~D4为a,也就是1010,意思就是单次传送11位的数据位吗


#include "DSP28_Device.h"

void WriteLED(unsigned char data);        //送给数码管的数据函数
//void delay(unsigned long t);

unsigned int * SPI_CS  = (unsigned int *) 0x4500;        //0X4500是CPLD的SPICS地址

unsigned long int a;

Uint16        SpiCode[]={0x7E7E,0x2929,0x2c2c,0x6666,0xa4a4,0xa0a0,0x3e3e,0x2020,0x2424,0x2222,0xe0e0,0xb1b1,0x6868,0xa1a1,0xa3a3,0xffff,0xdfdf};

void main(void)
{  
        int k;

        InitSysCtrl();
        
        DINT;
        IER = 0x0000;
        IFR = 0x0000;
        
        InitPieCtrl();
        
        InitPieVectTable();        
        
        InitPeripherals();
        
        EINT;           // Enable Global interrupt INTM
        ERTM;                // Enable Global realtime interrupt DBGM

        *SPI_CS=0x00;        //写0,低电平选中

        for(;;)
         {
                for(k=0;k<17;k++)                        //循环发送16个数据
                      {
                        WriteLED(SpiCode[k]);                //发送数据函数
                        for(a=0;a<500000;a++);
                       }
         }
}         

void WriteLED(unsigned char data)
{
          if(Spi_TxReady() == 1)                //当检测到SPI发送准备信号致1时,开始发送数据
             SpiaRegs.SPITXBUF = data;        //把数据写如SPI发送缓冲区
           while( Spi_TxReady()!=1);        //没检测到发送准备信号
             *SPI_CS=0x01;                        //关片选
            *SPI_CS=0x00;                        //退出时开片选
}

/*void delay(unsigned long t)
{
         while(t>0)
            t--;
}*/


void InitSpi(void)
{

        SpiaRegs.SPICCR.all = 0x08;///进入初始状态,数据在上升沿输出,自测禁止,8位数据模式

        SpiaRegs.SPICTL.all = 0x06;///正常的SPI时钟方式,主动模式,使能发送,禁止中断

        SpiaRegs.SPIBRR = 0x1D;//波特率 = LSPCLK/(SPIBRR+1)= 30/30 = 1M
        
        SpiaRegs.SPICCR.all = 0x8a; //退出初始状态
               
}

unsigned int Spi_TxReady(void)
{
        unsigned int i;
        if(SpiaRegs.SPISTS.bit.BUFFULL_FLAG == 1)////根据SPI的状态寄存器的缓冲标志位是否满,来确定发送函数是否可进行,学习时自己看下即可
        {
                i = 0;
        }
        else
        {
                i = 1;
        }
        return(i);
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。