本程序经验证可实现DSP和ARM的SPI通讯。
一、 SPI的通信协议
SPI(Serial Peripheral Interface)是一种串行同步通讯协议,由一个主设备和一个或多个从设备组成,主设备启动一个与从设备的同步通讯,从而完成数据的交换。SPI 接口一般由4根线组成,CS片选信号(有的单片机上也称为NSS),SCLK时钟信号线,MISO数据线(主机输入从机输出),MOSI数据线(主机输出从机输入),CS 决定了唯一的与主设备通信的从设备,如没有CS 信号,则只能存在一个从设备,主设备通过产生移位时钟信号来发起通讯。通讯时主机的数据由MISO输入,由MOSI 输出,输入的数据在时钟的上升或下降沿被采样,输出数据在紧接着的下降或上升沿被发出(具体由SPI的时钟相位和极性的设置而决定)。
串行协议框图
二、 例程
DSP TMS320F2808PZA做主机,ARM STM32F103VCT6做从机实现两芯片的SPI通讯。
1、 ARM从机例程。
ARM使用SPI1且工作于从模式。从机的SPI一直都是处于等待状态,一旦主机有数据发送过来,从机立即进入中断进行接收。接收数据的同时也向主机发送数据。
void SPI_Init_user(void) //SPI1配置函数
{
SPI_InitTypeDef SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
/* 使能 GPIOA 时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
/*SPI1外设时钟开 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
/*引脚配置*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出,复用模式的输入输出由程序决定。
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* SPI1 工作方式配置 */
SPI_Cmd(SPI1, DISABLE); //配置前先关闭SPI
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //全双工工作模式。
SPI_InitStructure.SPI_Mode = SPI_Mode_Slave; //设置SPI1为从模式。
SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b; //数据位16位
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //空闲时刻为高,DSP那边也设为高。
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge