打印

三个字节的地址不知如何填写

[复制链接]
921|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
午夜粪车|  楼主 | 2016-5-29 15:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
zhanghqi| | 2016-5-29 15:24 | 只看该作者
spi存储器的地址是如何映射的?

使用特权

评论回复
板凳
午夜粪车|  楼主 | 2016-5-29 15:26 | 只看该作者
cpu手册没看到给spi分配存储空间啊?

使用特权

评论回复
地板
wyjie| | 2016-5-29 15:27 | 只看该作者
应该发什么地址啊?

使用特权

评论回复
5
jlyuan| | 2016-5-29 15:28 | 只看该作者
啊?spi访问要地址吗   不会吧

使用特权

评论回复
6
dengdc| | 2016-5-29 15:31 | 只看该作者
网上找到的一些资料  
DSP TMS320F2812的SPI使用总结
1.       spi速率不能超过15M,超过后会出现严重误码
2.       如果接收方式为中断接收,SPICCR字符长度控制位决定了中断的字长。如字长为8,中断等级为1,则每接收一个字节产生一次中断。如字长为16,中断等级为1,则每接收2个字节产生一次中断。
3.       注意主模式和从模式的极性一定要相同。主模式为上升沿采样,下降沿输出。从模式也应该为上升沿采样,下降沿输出。否则会出现采样数据不准确。
4.       注意数据写入SPITXBUF时是左对齐,而读入SPIRXBUF是右对齐。这个问题在16位字长时不突出。但是在16位以下数据字长时要特别注意。一般方法是做左移运算。
5.       注意SPI FIFO的用法。
本人在调试过程中,遇到的最大问题就是数据丢失,困扰多天。后来查明原因,因为开启SPI FIFO增强功能,不能根据SpiaRegs.SPISTS.bit.BUFFULL_FLAG来暂停发送数据。因为此时的TXBUF是从TX FIFO中得数据。程序中写入TXBUF,只是写入发送缓冲器即FIFO。根据先进先出原理,你源源不断的向TXBUF写数据,则FIFO里总是保存你最后写入的数据,而不会将SpiaRegs.SPISTS.bit.BUFFULL_FLAG位置一,所以会发现数据丢失。正确的方法应该判断SPI TX FIFO中的字的个数。如果发送FIFO里已经有16个字了,此时应该停止发送新数据,而等待SPI总线上主机的时钟将TXBUF里数据移出,FIFO数据自动装载一个字到TXBUF里,这时才能发送新数据。

还有一些关于spi tx fifo中断的问题:
如果设置发送中断级别数为0,则产生发送fifo中断的条件是:tx fifo状态位小于级别位。
当进入中断之后,如果不向txbuf写数据,则该中断会一直出现。。。。
疑问:如果我在程序运行过程中发送完数据,不希望再出现发送fifo中断。应该如何做?
如果简单的关闭中断的话,又无法判断啥时有新的数据要发送。。。也不知道之前的数据是否都发送完毕.

使用特权

评论回复
7
dengdc| | 2016-5-29 15:32 | 只看该作者

程序如下:
interrupt void SpiTxFifoIsr(void)
{
             Uint16 i;
        if(spi_tx_counter){
                --spi_tx_counter;
                SpiaRegs.SPITXBUF = SPI_tx_buff[spi_tx_rd_index]; //发送一个字节数据,并调整指针
                      if (++spi_tx_rd_index == SPISIZE)                 spi_tx_rd_index = 0;
        }
        else if (spi_tx_counter>=16) //如果发送缓冲区中有16个待发的数据
        {
                for(i=0;i<16;i++){
                              --spi_tx_counter;
                              SpiaRegs.SPITXBUF = SPI_tx_buff[spi_tx_rd_index]; //发送一个字节数据,并调整指针
                              if (++spi_tx_rd_index == SPISIZE)                 spi_tx_rd_index = 0;
                }
           }
        else        //测试
        {
                for(i=0;i<16;i++){
                        SpiaRegs.SPITXBUF =i<<8;
                }
        }
    SpiaRegs.SPIFFTX.bit.TXFFINTCLR=1;  // Clear Interrupt flag
    PieCtrlRegs.PIEACK.all|=0x20;                  // Issue PIE ACK
}
spi_tx_counter是发送缓冲区的计数。发送fifo中断级别为0,当发送缓冲数组有数据时,则发送。
   但是,当发送缓冲区没有数据,而又触发了fifo发送中断,此时,如果没有else语句,则不断的进入该中断,无法进行其他指令执行。。。。
不知道该如何解决。

interrupt void SpiTxFifoIsr(void)
{
             Uint16 i;
        if(spi_tx_counter){
                --spi_tx_counter;
                SpiaRegs.SPITXBUF = SPI_tx_buff[spi_tx_rd_index]; //发送一个字节数据,并调整指针
                      if (++spi_tx_rd_index == SPISIZE)                 spi_tx_rd_index = 0;
        }
        else if (spi_tx_counter>=16) //如果发送缓冲区中有16个待发的数据
        {
                for(i=0;i<16;i++){
                              --spi_tx_counter;
                              SpiaRegs.SPITXBUF = SPI_tx_buff[spi_tx_rd_index]; //发送一个字节数据,并调整指针
                              if (++spi_tx_rd_index == SPISIZE)                 spi_tx_rd_index = 0;
                }
           }
        else        //测试
//////////关中断就行了。。。。等缓冲区大于16个数后再开中断
        }
    SpiaRegs.SPIFFTX.bit.TXFFINTCLR=1;  // Clear Interrupt flag
    PieCtrlRegs.PIEACK.all|=0x20;                  // Issue PIE ACK
}

使用特权

评论回复
8
jlyuan| | 2016-5-29 15:35 | 只看该作者
SPI 存储器地址和CPU所分配给存储器的地址是没有关系的。

使用特权

评论回复
9
dengdc| | 2016-5-29 15:36 | 只看该作者
看看SPI存储器的数据手册就知道怎么送SPI的地址了。

使用特权

评论回复
10
heweibig| | 2016-5-29 15:37 | 只看该作者

存储器的地址是你需要查看手册得到的。

使用特权

评论回复
11
jiahy| | 2016-5-29 15:37 | 只看该作者
你是要读取sd卡吗?

使用特权

评论回复
12
lizye| | 2016-5-29 15:38 | 只看该作者
把spi四个功能引脚设为gpio口 一位一位的发送   

使用特权

评论回复
13
shimx| | 2016-5-29 15:39 | 只看该作者
lizye 发表于 2016-5-29 15:38
把spi四个功能引脚设为gpio口 一位一位的发送

可以这样试试

使用特权

评论回复
14
spark周| | 2016-5-29 15:40 | 只看该作者
2812好像好容易坏

使用特权

评论回复
15
liliang9554| | 2016-5-29 15:41 | 只看该作者
我觉得还可以吧  dsp的灌电流都较小  只要使用恰当就没问题

使用特权

评论回复
16
zhaoxqi| | 2016-5-29 15:44 | 只看该作者
没有这么脆弱吧?

使用特权

评论回复
17
huangchui| | 2016-5-29 15:45 | 只看该作者

以前用的2812 不是很容易坏的。

使用特权

评论回复
18
午夜粪车|  楼主 | 2016-5-29 15:46 | 只看该作者
调了好久了,就是不通,手册看得很仔细了,还是找不出问题,继续研究中……

使用特权

评论回复
19
zhanghqi| | 2016-5-29 15:47 | 只看该作者
注意2812的输出时序的边沿变化、高低位顺序是否满足要求。

使用特权

评论回复
20
午夜粪车|  楼主 | 2016-5-29 15:48 | 只看该作者
嗯,知道了,先结贴了,周末快乐

使用特权

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

本版积分规则

867

主题

10194

帖子

3

粉丝