打印
[DSP编程]

求助mangui哥,关于DSP的SPI问题

[复制链接]
3672|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lphaff|  楼主 | 2013-10-25 20:57 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
DSP, GUI, AN, spi, AD
本帖最后由 zhangmangui 于 2013-10-26 00:22 编辑

问题是这样的,我用DSP的SPI与AD5360通过SPI通信
AD5360的控制字是24个bit,而DSP的发送寄存器是16位
DSP的SPICCR寄存器里面有一个字符长度控制,是bit3~bit0对应控制
现在在进行这个SPI通信的时候,DSP一次只能发16个bit,而AD5360从CS片选下降沿开始接收信号,接收24个bit的时候,CS必须给一个高电平上升沿信号结束通信,
请问,DSP怎么实现16个bit的buffer与AD5360的24个bit通信呢》
我仔细查阅过DSP的字符长度控制bit
它指的是作为一个字符发送的长度,主要是用在控制接受数据时决定接受几个bit产生中断
如果我把这个长度设成8,那么我写三次DSP的buffer,是不是每次都只发送BUFFER里面16个bit的高8位或者低8位呢?还是不管字符控制长度是多少,buffer一次性都是发送16个bit?
事实上我用示波器测试过,不管字符长度怎么设置,每写一次DSP的buffer ,DSP都会发送16个bit
所以,如果我只发一次,则AD5360无法接受24个bit ,若发送两次,则AD5360会接收到32个bit
总而言之,DSP发送的长度无法满足刚好是24个bit
不知道以上描述是否清楚,请mangui哥指点以下。谢谢。

相关帖子

沙发
charrijon| | 2013-10-25 22:16 | 只看该作者
SPI是可以只发8位的你发3次就可以,你设成8位还是发16位,应该是你设置有问题,我的设备每次就是发8位的

使用特权

评论回复
板凳
zhangmangui| | 2013-10-26 00:29 | 只看该作者
AD5360他的控制字一般是为了通用设计的  24bit只能用3个8bit
字符发送的长度设置就是启动一次发送传送几个字节

使用特权

评论回复
地板
zhangmangui| | 2013-10-26 00:45 | 只看该作者
这个应该能帮到你

使用特权

评论回复
5
pinda_| | 2013-10-26 12:09 | 只看该作者
:D 中断优先级, 学习了。

使用特权

评论回复
6
lphaff|  楼主 | 2013-10-28 19:32 | 只看该作者
本帖最后由 lphaff 于 2013-10-28 19:33 编辑

前面有一个问题已经验证过了,
那就是DSP的字符控制位确实可以控制BUFFER里面发送的字符的长度
但是有一个问题:
那就是我设置成8个bit为长度的时候
我的CS选中的时候,我往AD5360里面发送了3个数据,但是CS的低电平只有16个脉冲
所以,我必须向DSP的BUFFER写四个字节,CS的低电平才能保证24个脉冲

不知道是不是DSP的BUFFER在发送的时候还有其他的设置选项?

                for(counter=0;counter<16;counter++)
                {
                        AD_LDAC        = 1;
                        AD_CS        = 1;
                        for(j=0;j<2;j++){}    //启动前现给一次下降沿确认发送数据   
                        AD_CS        = 0;               
                            SpiaRegs.SPITXBUF=0xCF00;//Config word
                        SpiaRegs.SPITXBUF        = tab[counter];//Wave data
                        SpiaRegs.SPITXBUF        = 0;//wave data
                        SpiaRegs.SPITXBUF        = 0;//这里若不写一次BUFFER,则DSP的CS的低电平只能有16个脉冲
                           while(SpiaRegs.SPIFFTX.bit.TXFFST!=0){}
                        AD_CS=1;
        

使用特权

评论回复
7
lphaff|  楼主 | 2013-10-28 19:47 | 只看该作者
这两个图对应的分别是是否加了那个
【SpiaRegs.SPITXBUF        = 0;//这里若不写一次BUFFER,则DSP的CS的低电平只能有16个脉冲】
的区别。

TEK00004.BMP (301.05 KB )

TEK00004.BMP

TEK00002.BMP (301.05 KB )

TEK00002.BMP

使用特权

评论回复
8
lphaff|  楼主 | 2013-10-28 19:49 | 只看该作者
就是如果只给BUFFER写3次数据的话,CS的低电平只包括16个脉冲,而实际上是写了24个bit的数据
所以必须多写一次buffer,才能包括24个脉冲
还一句话说,发的数据里面,有8个脉冲是移到了CS的高电平。

使用特权

评论回复
9
lphaff|  楼主 | 2013-10-28 20:44 | 只看该作者

使用特权

评论回复
10
zhangmangui| | 2013-10-28 21:52 | 只看该作者
lphaff 发表于 2013-10-28 19:32
前面有一个问题已经验证过了,
那就是DSP的字符控制位确实可以控制BUFFER里面发送的字符的长度
但是有一个 ...

既然设置为8bit  那就给buffer中送入一个字节  然后while等待发送结束
然后在往buffer中写入下一个字节   这样才合理

使用特权

评论回复
11
lphaff|  楼主 | 2013-10-29 08:49 | 只看该作者
zhangmangui 发表于 2013-10-28 21:52
既然设置为8bit  那就给buffer中送入一个字节  然后while等待发送结束
然后在往buffer中写入下一个字节   ...

有道理,等下试试。

使用特权

评论回复
12
lphaff|  楼主 | 2013-10-29 15:32 | 只看该作者
zhangmangui 发表于 2013-10-28 21:52
既然设置为8bit  那就给buffer中送入一个字节  然后while等待发送结束
然后在往buffer中写入下一个字节   ...

满哥,我这么改过了还是只有16个脉冲包含在CS的低电平里面。。

for(counter=0;counter<16;counter++)
                {
                        AD_LDAC        = 1;
                        AD_CS        = 1;
                        for(j=0;j<2;j++){}       
                        AD_CS        = 0;               
                     SpiaRegs.SPITXBUF=0xCF00;
                           while(SpiaRegs.SPIFFTX.bit.TXFFST!=0){}
                        SpiaRegs.SPITXBUF        = tab[counter];
                           while(SpiaRegs.SPIFFTX.bit.TXFFST!=0){}
                        SpiaRegs.SPITXBUF        = 0x0000;
                           while(SpiaRegs.SPIFFTX.bit.TXFFST!=0){}
                        AD_CS=1;
                        for(j=0;j<5;j++){}
                        AD_LDAC        = 0;
                        for(j=0;j<2000;j++){}

使用特权

评论回复
13
lphaff|  楼主 | 2013-10-29 17:17 | 只看该作者
zhangmangui 发表于 2013-10-28 21:52
既然设置为8bit  那就给buffer中送入一个字节  然后while等待发送结束
然后在往buffer中写入下一个字节   ...

for(counter=0;counter<16;counter++)
                {
                        AD_LDAC        = 1;
                        AD_CS        = 1;
                        for(j=0;j<2;j++){}       
                        AD_CS        = 0;               
                     SpiaRegs.SPITXBUF=0xCF00;
                    while(SpiaRegs.SPIFFTX.bit.TXFFST!=0){}
                        SpiaRegs.SPITXBUF        = tab[counter];
                    while(SpiaRegs.SPIFFTX.bit.TXFFST!=0){}
                        SpiaRegs.SPITXBUF        = 0x0000;
                    while(SpiaRegs.SPIFFTX.bit.TXFFST!=0){}
//                        SpiaRegs.SPITXBUF        = 0x0000;
//   while(SpiaRegs.SPIFFTX.bit.TXFFST!=0){}
                        AD_CS=1;
                        AD_LDAC        = 0;
                        for(j=0;j<500;j++){}

tek00013.bmp (1.1 MB )

tek00013.bmp

使用特权

评论回复
14
lphaff|  楼主 | 2013-10-29 17:20 | 只看该作者
从上面的波形看,CS还是只能包含16个时钟脉冲,仍然有8个时钟脉冲被延迟到了外面
:(

使用特权

评论回复
15
zhangmangui| | 2013-10-29 18:36 | 只看该作者
lphaff 发表于 2013-10-29 17:20
从上面的波形看,CS还是只能包含16个时钟脉冲,仍然有8个时钟脉冲被延迟到了外面
...

依然有8个clk在后面 说明你的SPI的单工的   传送完一个字节数据之后  有启动8个clk接收

使用特权

评论回复
16
lphaff|  楼主 | 2013-11-21 12:01 | 只看该作者
zhangmangui 发表于 2013-10-29 18:36
依然有8个clk在后面 说明你的SPI的单工的   传送完一个字节数据之后  有启动8个clk接收 ...

满哥,有办法没?

使用特权

评论回复
17
lphaff|  楼主 | 2013-11-21 12:48 | 只看该作者
看了一下寄存器,貌似SPI的TXFFST一直就是0,另外,STS.INTFLAG也一直是0

使用特权

评论回复
18
zhangmangui| | 2013-11-21 13:07 | 只看该作者
lphaff 发表于 2013-11-21 12:48
看了一下寄存器,貌似SPI的TXFFST一直就是0,另外,STS.INTFLAG也一直是0

问题还没解决啊  应该还是没配置好   有没有例程  先参考一下

使用特权

评论回复
19
lphaff|  楼主 | 2013-11-21 13:09 | 只看该作者
按照文档上,INT_Flag置位后,要读一次RX BUFFER才会清零,单步仿真的时候,中断标志位一直就没有为1过。

使用特权

评论回复
20
lphaff|  楼主 | 2013-11-21 13:11 | 只看该作者
zhangmangui 发表于 2013-11-21 13:07
问题还没解决啊  应该还是没配置好   有没有例程  先参考一下

是啊,,前段时间是用示波器加了一个延时,让这个延时刚好等于8个时钟,但是这终究不是长久之计啊。
现在想重点解决一下这个问题。
我猜应该是配置的问题,但是,自己深陷其中,不知道配置问题出在什么地方了。

使用特权

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

本版积分规则

个人签名:长沙电路设计爱好者,欢迎加群学术探讨、项目合作群:1636625

55

主题

540

帖子

2

粉丝