您的位置:首页 > 其它

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

2017-01-13 21:35 295 查看
最近一段时间忙着考试,没留意试用报告分享时间是到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 <<CSL_SPI_SPIGCR0_RESET_SHIFT);//寄存器复位

delay(10);

spiRegs->SPIGCR0= (CSL_SPI_SPIGCR0_RESET_OUT_OF_RESET <<CSL_SPI_SPIGCR0_RESET_SHIFT);//寄存器脱离复位

spiRegs->SPIGCR1= (

(CSL_SPI_SPIGCR1_CLKMOD_INTERNAL <<CSL_SPI_SPIGCR1_CLKMOD_SHIFT)|

(CSL_SPI_SPIGCR1_MASTER_MASTER<<CSL_SPI_SPIGCR1_MASTER_SHIFT)

//|(CSL_SPI_SPIGCR1_LOOPBACK_ENABLE<<CSL_SPI_SPIGCR1_LOOPBACK_SHIFT)

);//Mater模式

spiRegs->SPIPC0= (

(CSL_SPI_SPIPC0_SOMIFUN_SPI <<CSL_SPI_SPIPC0_SOMIFUN_SHIFT)|

(CSL_SPI_SPIPC0_SIMOFUN_SPI <<CSL_SPI_SPIPC0_SIMOFUN_SHIFT)|

(CSL_SPI_SPIPC0_CLKFUN_SPI <<CSL_SPI_SPIPC0_CLKFUN_SHIFT)

// |(CSL_SPI_SPIPC0_ENAFUN_SPI<<CSL_SPI_SPIPC0_ENAFUN_SHIFT)

|(CSL_SPI_SPIPC0_SCS0FUN1_SHIFT<<CSL_SPI_SPIPC0_SCS0FUN1_SPI )

);//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<<CSL_SPI_SPIINT0_RXINTENA_SHIFT);

// spiRegs->SPIDEF= (CSL_SPI_SPIDEF_CSDEF0_LOW<<CSL_SPI_SPIDEF_CSDEF0_SHIFT);

// spiRegs->SPIFMT[0]= (CSL_SPI_SPIFMT_SHIFTDIR_MSB <<CSL_SPI_SPIFMT_SHIFTDIR_SHIFT);

// SETBIT(spiRegs->SPIFMT[0], (29 << 8)|(16<<0));//SPICLK=420/2/(29+1),16Bit

// spiRegs->SPILVL = (CSL_SPI_SPILVL_RXINTLVL_INT1<<CSL_SPI_SPILVL_RXINTLVL_SHIFT);

spiRegs->SPIDELAY= ((16 <<CSL_SPI_SPIDELAY_T2CDELAY_SHIFT)

|(16 <<CSL_SPI_SPIDELAY_T2EDELAY_SHIFT)

|(16 <<CSL_SPI_SPIDELAY_C2TDELAY_SHIFT)

|(16 <<CSL_SPI_SPIDELAY_C2EDELAY_SHIFT)

);

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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: