求教高手,我要用DSP的SPI模块来发送一些数据给数码管显示出来,该如何初始化SPI模块?有段代码是这样的,请高手给说明下:
/*配置控制寄存器设置*/
SpiaRegs.SPICCR.all = 0x07;///进入初始状态,数据在上升沿输出,自测禁止,8位数据模式
/*操作控制寄存器设置*/
SpiaRegs.SPICTL.all = 0x06;///正常的SPI时钟方式,主动模式,使能发送,禁止中断
/*波特率的设置*/
SpiaRegs.SPIBRR = 0x1D;//波特率 = LSPCLK/(SPIBRR+1)= 30/30 = 1M
SpiaRegs.SPICCR.all = 0x8a; //退出初始状态 ?????????????????????????????????????????????? | SPICCR的配置控制寄存器:
SpiaRegs.SPICCR.bit.RESET = 0; //初始化SPI操作标志到复位状态
SpiaRegs.SPICCR.bit.CLKPOLARITY = 0; //设置上升沿输出数据,下降沿输入数据
SpiaRegs.SPICCR.bit.SPILBK = 0; //禁止SPI回送模式
SpiaRegs.SPICCR.bit.SPICHAR = 7; //一次移入或移出8个字符
SPICTL的操作控制寄存器:
SpiaRegs.SPICTL.bit.OVERRUN = 0; //禁止溢出中断
SpiaRegs.SPICTL.bit.CLK_PHASE = 0; //不延时相位
SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1; //设置为主机
SpiaRegs.SPICTL.bit.TALK = 1; //使能主机/从机发送使能位
SpiaRegs.SPICTL.bit.SPIINTENA = 0; //不使能SPI中断位
SpiaRegs.SPIBRR = 0x1D; //设置波特率=LSPCLK/(SPIBRR+1)=30MHz/30=1MHz
SpiaRegs.SPICCR.bit.RESET = 1; //SPI准备或接受下一个字符
在板子上调试的时候发现只有发送SpiaRegs.SPICCR.bit.SPICHAR = 10; 即发送字符长度为11位的时候代码才能得到正确的结果,但数码管所需要得到的数据只有8位啊。
查了些资料,在网上找到这个
以前大概看过SPI,所以没怎么看课本写的程序,今天看了下程序,特此把程序中错误的地方分享给大家。希望初学者不要被错误的例子左右。
1.
开发板的发光管为共阴极,共阴极的发光管点亮是有顺序的,课本上写的是
1~f是{0x7E,0x29,0x2c,0x66,0xa4,0xa0,0x3e,0x20,0x24,0x22,0xe0,0xb1,0x68,0xa1,0xa3}
实际上这是错误的,应该是
{0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
///////////////////不过我的板子是共阳极的数码管,这里没有问题
2.
SpiaRegs.SPICCR.all = 0x08;///进入初始状态,数据在上升沿输出,自测禁止,8位数据模式
这句话其实也是错误的。
首先0x08表示的是上升沿输出,9位数据模式。但是74HC595这个芯片是上升沿输入数据,所以主机应该改成下降沿输出
正确的应该是SpiaRegs.SPICCR.all = 0x47;///进入初始状态,数据在下升沿输出,自测禁止,7位数据模式
3.
SpiaRegs.SPICCR.all = 0x8a; //退出初始状态
这句话也有错误。因为上面已经对这个寄存器别的数据进行了设置,所以执行设置SpiaRegs.SPICCR.bit.RESET=1就可以了,再者,作者也不对,明显的前后的字节控制位都一样长。
4.
因为发送数据缓冲寄存器和数据寄存器都是右对齐方式,高位在最右边。所以要把要传输的数据进行一下改变,可以用<<这个符号右移8位,也可以写成{0xf9xx,0xa4xx,0xb0xx,0x99xx,0x92xx,0x82xx,0xf8xx,0x80xx,0x90xx,0x88xx,0x83xx,0xc6xx,0xa1xx,0x86xx,0x8exx};
之类。其中xx为0~f的任意值。
提醒大家:helldsp这本书作为入手dsp的经典之作,给了初学者很大的帮助,但书中也有部分错误,希望学习时要勤动手,多看些外文资料,不要认为书上都是对的。
有人可能会问为什么错误的程序仿真时能得到正确的结果呢,我想是因为凑巧了吧。不信你把程序烧入dsp中,就会看到结果是错的。 | 但这么改得到的结果在板子上跑的程序是错的。。。。。求解
|