DSP

创龙TMS320C6748开发板———SPI接口配置

2019-07-13 16:17发布

最近一段时间忙着考试,没留意试用报告分享时间是到20号~先说声抱歉了
先把程序放上来供大家参考,等考完试我再把相关寄存器配置说明补上~~~再说声抱歉

这部分介绍SPI接口配置,这个接口主要用于传输串行数据,在AD、DA采集和波形转换上非常常用,最后附一个使用SPI接口发送数据的例程。
一、SPI接口简介
SPI(Serial Peripheral Interface,串行外设接口)是Motorola公司提出的一种同步串行数据传输标准,在很多器件中被广泛应用。SPI接口经常被称为4线串行总线,以主/从方式工作,数据传输过程由主机初始化。 1)SCLK:串行时钟,用来同步数据传输,由主机输出; 2) MOSI:主机输出从机输入数据线; 3) MISO:主机输入从机输出数据线; 4) SCS:片选线,低电平有效,由主机输出。 在SPI总线上,某一时刻可以出现多个从机,但只能存在一个主机,主机通过片选线来确定要通信的从机。这就要求从机的MISO口具有三态特性,使得该口线在器件未被选通时表现为高阻抗。 1、SPI 硬件IO资源,通信时需要用到的管脚:

由上图可以看到SPI接口简单,最多需要五根控制线就可以完成数据传递。SIMO:从机模式下串行数据输入;SOMI:主机模式下串行输出;CLK:时钟信号;SCS:片选信号;ENA:从机模式下指示从机就绪。 2、SPI 操作模式 无论是主机模式还是从机模式,SPI接口支持以下通信模式: • 3-pin option[最简单模式] • 4-pin withchip select option[多了SCS片选信号,可使用一根SPI总线完成多从机设备的支持] • 4-pin withenable option[增加了ENA引脚,通过硬件握手增加了数据的吞吐量] • 5-pin withenable and chip select option 3、时钟相位及极性
1、3模式时钟信号没有延迟。        此外,有上图我们还可以看到,在一个SPI时钟周期内,会完成如下操作: 1) 主机通过MOSI线发送1位数据,从机通过该线读取这1位数据; 2) 从机通过MISO线发送1位数据,主机通过该线读取这1位数据。        这是通过移位寄存器来实现的。主机和从机各有一个移位寄存器,且二者连接成环。随着时钟脉冲,数据按照从高位到低位的方式依次移出主机寄存器和从机寄存器,并且依次移入从机寄存器和主机寄存器。当寄存器中的内容全部移出时,相当于完成了两个寄存器内容的交换。 4、数据模式
       发送数据和接收数据支持2~16位,通过寄存器SPIFMTn.CHARLEN配置。发送数据格式为右对齐,高位任意,发送数据存储在SPIDAT1寄存器中;接收数据格式为右对齐,高位补零至16位,发送数据存储在SPIBUF寄存器中;数据串行发送方向由SPIFMTn.SHIFTDIR决定,当其为0时,发送数据从MSB至LSB发送,当其为1时,发送数据从LSB至MSB发送。
二、SPI接口寄存器介绍
(稍后再补)

三、基于CSLr的SPI数据发送例程
1、SPI初始化配置程序
extern void setup_SPI1( )//
{
  spiRegs->SPIGCR0=   (CSL_SPI_SPIGCR0_RESET_IN_RESET <
  delay(10);
  spiRegs->SPIGCR0=   (CSL_SPI_SPIGCR0_RESET_OUT_OF_RESET <
  spiRegs->SPIGCR1=   (
                 (CSL_SPI_SPIGCR1_CLKMOD_INTERNAL <
                 (CSL_SPI_SPIGCR1_MASTER_MASTER<
                 //|(CSL_SPI_SPIGCR1_LOOPBACK_ENABLE<
                    );//Mater模式
  spiRegs->SPIPC0=   (
                 (CSL_SPI_SPIPC0_SOMIFUN_SPI <
                 (CSL_SPI_SPIPC0_SIMOFUN_SPI <
                 (CSL_SPI_SPIPC0_CLKFUN_SPI <
//                 |(CSL_SPI_SPIPC0_ENAFUN_SPI<
                    |(CSL_SPI_SPIPC0_SCS0FUN1_SHIFT<
                    );//4PIN,使能片选
  spiRegs->SPIFMT[0] = CSL_FMK(SPI_SPIFMT_CHARLEN,0x10)
                                   | CSL_FMK(SPI_SPIFMT_PRESCALE,5)//工作在35MHz
                                   | CSL_FMK(SPI_SPIFMT_PHASE,0)
                                   | CSL_FMK(SPI_SPIFMT_POLARITY,1);
//  spiRegs->SPIINT0= (CSL_SPI_SPIINT0_RXINTENA_ENABLE<
//  spiRegs->SPIDEF=   (CSL_SPI_SPIDEF_CSDEF0_LOW<
//  spiRegs->SPIFMT[0]=   (CSL_SPI_SPIFMT_SHIFTDIR_MSB <
//  SETBIT(spiRegs->SPIFMT[0], (29 << 8)|(16<<0));//SPICLK=420/2/(29+1),16Bit
//  spiRegs->SPILVL = (CSL_SPI_SPILVL_RXINTLVL_INT1<
   spiRegs->SPIDELAY= ((16 <
     |(16 <
     |(16 <
     |(16 <
     );
spiRegs->SPIGCR1 |=  CSL_FMK(SPI_SPIGCR1_ENABLE,0x01);
}
2、SPI数据发送函数
void SPI_Transfer(Uint16 *SPI_SRC,Uint16 *SPI_DST)//数据回传函数
{
  int ii;
  for(ii=0;ii<256;ii++)
     {
        while (CHKBIT(spiRegs->SPIBUF, 0x20000000))
        {
       ;
        }
       CSL_FINS(spiRegs->SPIDAT0,SPI_SPIDAT1_TXDATA,*SPI_SRC++);
       delay(30);//稍加延时
       *SPI_DST++=CSL_FEXT(spiRegs->SPIBUF,SPI_SPIBUF_RXDATA);
     }
}
3、主函数
void main(void)
{
    setup_SPI1();//配置SPI接口
    asm("nop");
for(kk=0;kk<256;kk++)
{
  SRC[kk]=kk;
}
SPI_Transfer(&SRC[0],&DST[0]);
while(1);
}