本帖最后由 沈士杰 于 2015-12-6 15:55 编辑
最近一段时间忙着考试,没留意试用报告分享时间是到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接口支持以下通信模式: • 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);
}
|