关于DSP28027的spi学习总结(1)

最近刚刚接触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[i]);
}
根据测试结果,可以从示波器上清晰的看到连续的时钟信号,持续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[i]);
}
通过测试,F28027通过这种按字节发送的方式,最多可以连续发送5个字节的数据,并保证数据不乱。但这样的发送方式很明显浪费掉了一部分寄存器的位置,有待改进。

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

  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值