本帖最后由 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);
}
|