硬件环境:DSP为TMS320C6722,STM32为STM32F103ZG,两控制芯片为SPI三线连接,即SPI_SOMI,SPI_SIMO,SPI_CLK三线.
首先整体简述下传输过程,DSP与STM32为SPI三线连接,无片选信号;DSP有一GPIO引脚连接至STM32外部中断引脚(在此处称为DataReady引脚);SPI虽然为全双工,但是在此项目中只需要DSP传输给STM32的数据,而不关心STM32传输给DSP的数据。STM32作为主机,DSP作为从机。为了节约CPU,从主机均使用SPI的DMA传输。数据传输的整体流程是这样的:DSP准备好数据后,会通过DataReady引脚由低电平变为高电平来触发STM32的外部中断,STM32在外部中断中将DMA开启,然后数据开始传输,STM32传输完成进入DMA传输完成中断,关闭DMA,STM32对收到的数据进行处理。
下面简述DSP这边需要做的工作:
熟悉C672x系列的人都知道,DMA在此系列芯片中占有相当大的作用(在C672x中称为dMAX)。DMA在C672x中可以进行数据传输、接收外部中断信号、触发CPU中断等等。
对SPI及DMA进行配置:先对SPI进行配置,具体流程参考C672x的SPI手册(下面我也会贴出代码);然后对DMA的事件入口及传输入口进行配置。
#define SPIGCR0 0x0000
#define SPIGCR1 0x0001
#define SPIINT0 0x0002
#define SPILVL 0x0003
#define SPIFLG 0x0004
#define SPIPC0 0x0005
#define SPIPC1 0x0006
#define SPIPC2 0x0007
#define SPIPC3 0x0008
#define SPIPC4 0x0009
#define SPIDAT0 0x000E
#define SPIDAT1 0x000F
#define SPIBUF 0x0010
#define SPIDELAY 0x0012
#define SPIFMT0 0x0014
#define SPIFMT1 0x0015
#define SPIFMT2 0x0016
#define SPIFMT3 0x0017
#define DEPR 0x0000
#define DEER 0x0001
#define DEDR 0x0002
#define DEHPR 0x0003
#define DELPR 0x0004
#define DEFR 0x0005
#define DTCR0 0x001F
#define TransferEntry0 0x0000
#define TransferEntry1 0x0001
#define TransferEntry2 0x0002
#define TransferEntry3 0x0003
#define TransferEntry4 0x0004
#define TransferEntry5 0x0005
#define TransferEntry6 0x0006
#define TransferEntry7 0x0007
#define DMAX_DATA_TRANSFER_COUNT 8
volatile unsigned int * spi0_ptr = (unsigned int *) 0x47000000;
vol