求助mangui哥,关于DSP的SPI问题
本帖最后由 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哥指点以下。谢谢。
SPI是可以只发8位的你发3次就可以,你设成8位还是发16位,应该是你设置有问题,我的设备每次就是发8位的 AD5360他的控制字一般是为了通用设计的24bit只能用3个8bit
字符发送的长度设置就是启动一次发送传送几个字节
这个应该能帮到你
:D 中断优先级, 学习了。 本帖最后由 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;//Wave data
SpiaRegs.SPITXBUF = 0;//wave data
SpiaRegs.SPITXBUF = 0;//这里若不写一次BUFFER,则DSP的CS的低电平只能有16个脉冲
while(SpiaRegs.SPIFFTX.bit.TXFFST!=0){}
AD_CS=1;
这两个图对应的分别是是否加了那个
【SpiaRegs.SPITXBUF = 0;//这里若不写一次BUFFER,则DSP的CS的低电平只能有16个脉冲】
的区别。 就是如果只给BUFFER写3次数据的话,CS的低电平只包括16个脉冲,而实际上是写了24个bit的数据
所以必须多写一次buffer,才能包括24个脉冲
还一句话说,发的数据里面,有8个脉冲是移到了CS的高电平。 @zhangmangui lphaff 发表于 2013-10-28 19:32 static/image/common/back.gif
前面有一个问题已经验证过了,
那就是DSP的字符控制位确实可以控制BUFFER里面发送的字符的长度
但是有一个 ...
既然设置为8bit那就给buffer中送入一个字节然后while等待发送结束
然后在往buffer中写入下一个字节 这样才合理 zhangmangui 发表于 2013-10-28 21:52 static/image/common/back.gif
既然设置为8bit那就给buffer中送入一个字节然后while等待发送结束
然后在往buffer中写入下一个字节 ...
有道理,等下试试。 zhangmangui 发表于 2013-10-28 21:52 static/image/common/back.gif
既然设置为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;
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++){} zhangmangui 发表于 2013-10-28 21:52 static/image/common/back.gif
既然设置为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;
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++){}
从上面的波形看,CS还是只能包含16个时钟脉冲,仍然有8个时钟脉冲被延迟到了外面
:( lphaff 发表于 2013-10-29 17:20 static/image/common/back.gif
从上面的波形看,CS还是只能包含16个时钟脉冲,仍然有8个时钟脉冲被延迟到了外面
...
依然有8个clk在后面 说明你的SPI的单工的 传送完一个字节数据之后有启动8个clk接收 zhangmangui 发表于 2013-10-29 18:36 static/image/common/back.gif
依然有8个clk在后面 说明你的SPI的单工的 传送完一个字节数据之后有启动8个clk接收 ...
满哥,有办法没? 看了一下寄存器,貌似SPI的TXFFST一直就是0,另外,STS.INTFLAG也一直是0 lphaff 发表于 2013-11-21 12:48 static/image/common/back.gif
看了一下寄存器,貌似SPI的TXFFST一直就是0,另外,STS.INTFLAG也一直是0
问题还没解决啊应该还是没配置好 有没有例程先参考一下 按照文档上,INT_Flag置位后,要读一次RX BUFFER才会清零,单步仿真的时候,中断标志位一直就没有为1过。 zhangmangui 发表于 2013-11-21 13:07 static/image/common/back.gif
问题还没解决啊应该还是没配置好 有没有例程先参考一下
是啊,,前段时间是用示波器加了一个延时,让这个延时刚好等于8个时钟,但是这终究不是长久之计啊。
现在想重点解决一下这个问题。
我猜应该是配置的问题,但是,自己深陷其中,不知道配置问题出在什么地方了。
页:
[1]
2