[资料分享] DSP28027的spi学习

Jacktang   2019-2-12 22:17 楼主
刚接触TI公司DSP28027和DSP28335系列芯片,作为一个刚刚进入实验室的小白,想把自己学习的一些心得记录下来,以供以后的自己随时回忆,并学习。


首先,spi(Serial Peripheral Interface)串行外设接口,广泛应用于EEPROM、实时时钟、A/D转换、D/A转换等器件,属于高速、全双工通信总线,占用了四个引脚,分别为MOSI,MISO,CLK,SCS四根线。


利用28027的SPI可以快速方便的进行配置,并发送数据。SPI单词发送数据可以发送16位的数据,利用官方例程中的发送函数:
void spi_xmit(Uint16 a)
{
    SpiaRegs.SPITXBUF=a;
}
可以实现简单的16位数据的发送。当然在配置寄存器时要格外注意控制寄存器SPICCR,例如要实现16位数的发送就可以写如下代码:
void spi_init()
{
SpiaRegs.SPICCR.all =0x000F;              // Reset on, rising edge, 16-bit char bits
SpiaRegs.SPICTL.all =0x0006;         // Enable master mode, normal phase,
                                                                      // enable talk, and SPI int disabled.
SpiaRegs.SPIBRR =0x007F;
    SpiaRegs.SPICCR.all =0x009F;          // Relinquish SPI from Reset
    SpiaRegs.SPIPRI.bit.FREE = 1;                // Set so breakpoints don't disturb xmission
}
要实现这样简单的功能并不需要配置FIFO寄存器。


然而,往往在控制系统中对于信息的传输不满足于简单的一个数据,往往需要一串数据来实现相应的控制功能。因此我们需要利用到FIFO寄存器来实现多数据的传送。
举个例子,我们需要连续发送4个16位数据,那么除了上述void spi_init()函数,还需要配置FIFO寄存器初始化
void spi_fifo_init()
{                                                           
    SpiaRegs.SPIFFTX.all=0xE040;             // Initialize SPI FIFO 无中断
    SpiaRegs.SPIFFRX.all=0x2044;            
    SpiaRegs.SPIFFCT.all=0x0;                  //发送无延迟
}
如此,再利用发送函数,就可以实现4个数据的连续发送
  for(i=0;i<4;i++)
{
spi_xmit(spi_TX);
}
根据测试结果,可以从示波器上清晰的看到连续的时钟信号,持续64个时钟周期,并且数据也没有错。根据测试结果,F28027按照如上配置最多可以发送5个16位数据,若要发送6个及以上就会出现数据丢失的现象。


上面所述是发送数据为偶数字节的情况,但在实际的使用中,有时需要我们按照字节发送数据,强大的spi模块也可以实现这样的功能。
首先需要改变SPICCR寄存器的字符控制位:
void spi_init()
{
SpiaRegs.SPICCR.all =0x0007;   // Reset on, rising edge, 16-bit char bits字符控制位设置为8字节
SpiaRegs.SPICTL.all =0x0006;         // Enable master mode, normal phase,
                                                            
SpiaRegs.SPIBRR =0x007F;
    SpiaRegs.SPICCR.all =0x0097;          // 字符控制位设置为8字节
    SpiaRegs.SPIPRI.bit.FREE = 1;                // Set so breakpoints don't disturb xmission
}
在发送时,我们需要注意,SPI的SPITXBUF中的数据应该左对齐,因为发送的时候是从MSB位最先开始发送的,因此在发送时需要把相应的8位数据向左移8位。
例如试图发送数据0xAA,在不右移的情况下
a=0xAA;
SpiaRegs.SPITXBUF=a;
只会在8个时钟中期中发送00,因为SPITXBUF寄存器是一个16位的寄存器。因此应该
SpiaRegs.SPITXBUF=(a<<8);
如此,就可以在8个时钟周期发送出一个8位的数据。


如此,在连续发送数据时也可以连续执行发送函数
for(i=0;i<4;i++)
{
spi_xmit(spi_TX);
}
通过测试,F28027通过这种按字节发送的方式,最多可以连续发送5个字节的数据,并保证数据不乱。但这样的发送方式很明显浪费掉了一部分寄存器的位置,有待改进。


以上便是对于SPI的一些心得体会,认知还停留在非常入门的阶段,在今后的学习中希望能解决目前的不足,尽早熟练。

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复