打印
[DSP编程]

关于DSP2812SPI的初始化

[复制链接]
5143|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
asas1235813|  楼主 | 2013-8-28 11:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
求教高手,我要用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中,就会看到结果是错的。
但这么改得到的结果在板子上跑的程序是错的。。。。。求解





相关帖子

沙发
zhangmangui| | 2013-8-28 17:26 | 只看该作者
EX04_SPILED.rar (287.51 KB)

你先按照我上传的代码对比看看   

使用特权

评论回复
板凳
asas1235813|  楼主 | 2013-8-28 17:32 | 只看该作者
zhangmangui 发表于 2013-8-28 17:26
你先按照我上传的代码对比看看

版主用的是零零电子的TOP2812开发板?

使用特权

评论回复
地板
zhangmangui| | 2013-8-28 17:33 | 只看该作者
asas1235813 发表于 2013-8-28 17:32
版主用的是零零电子的TOP2812开发板?

嗯  是的   大学使用过

使用特权

评论回复
5
asas1235813|  楼主 | 2013-8-28 17:39 | 只看该作者
zhangmangui 发表于 2013-8-28 17:33
嗯  是的   大学使用过

表示我现在用的也是这块板子:lol,不过里面的资料貌似不太全。。。。。。像扩展的CPLD的控制寄存器都是从例程代码里面找到的。。。。。。

使用特权

评论回复
6
zhangmangui| | 2013-8-28 18:36 | 只看该作者
asas1235813 发表于 2013-8-28 17:39
表示我现在用的也是这块板子,不过里面的资料貌似不太全。。。。。。像扩展的CPLD的控制寄存器都是从 ...

对   记得CPLD 译码这一块不提供   

使用特权

评论回复
7
漓江金雨| | 2017-3-11 15:53 | 只看该作者
时钟延迟半个周期即可,为了配合74595锁存数据,不然正好丢两个数,配置如下:
    /*配置控制寄存器设置*/
        SpiaRegs.SPICCR.all = 0x07;///进入初始状态,数据在上升沿输出,自测禁止,8位数据模式
        /*操作控制寄存器设置*/
        SpiaRegs.SPICTL.all = 0x0E;///延迟半个周期的SPI时钟方式,主动模式,使能发送,禁止中断
        /*波特率的设置*/
        SpiaRegs.SPIBRR = 0x1D;//波特率 = LSPCLK/(SPIBRR+1)= 30/30 = 1M
       
        SpiaRegs.SPICCR.all = 0x87; //退出初始状态

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

29

帖子

0

粉丝