DMA模式开启FIFO,CLK脚不连续最小间隔1.5T的CLK时钟
- void DMA_Config(void)
- {
- DMA_SPI_STA = 0x00;
- DMA_SPI_CFG = 0xE0; //bit7 1:Enable Interrupt
- DMA_SPI_AMT = 0xff; //设置传输总字节数:n+1
-
- DMA_SPI_TXAH = (u8)((u16)&DmaTxBuffer >> 8); //SPI发送数据存储地址
- DMA_SPI_TXAL = (u8)((u16)&DmaTxBuffer);
- DMA_SPI_RXAH = (u8)((u16)&DmaRxBuffer >> 8); //SPI接收数据存储地址
- DMA_SPI_RXAL = (u8)((u16)&DmaRxBuffer);
-
- DMA_SPI_CFG2 = 0x01; //01:P2.2
- DMA_SPI_CR = 0x80; //bit7 1:使能 SPI_DMA, bit6 1:开始 SPI_DMA 主机模式, bit0 1:清除 SPI_DMA FIFO
-
- HSSPI_CFG = 0x00; //高速模式时SS 控制信号的HOLD 和SETUP 时间设置0,CLK最小间隔1.5T
- HSSPI_CFG2 = 0x00; //高速模式时SS 控制信号的DEACTIVE 时间设置0,CLK最小间隔1.5T
- HSSPI_CFG2 |= 1<<5; //使能SPI高速模式
-
- }
复制代码
SPI通讯,普通模式和DMA模式混用的时候一定要注意FIFO的禁用和使能。 普通模式,必须禁用FIFO,否则死机。 - void SPI_WriteByte(u8 out)
- {
- HSSPI_CFG2 &= ~0x10; //禁止FIFO,不然普通模式死机
- SPDAT = out;
- SPIF = 1; //清SPIF标志,防止DMA混用出问题,DMA最后完成,标志位会置位的。
- while(SPIF == 0);
- SPIF = 1; //清SPIF标志
- WCOL = 1; //清WCOL标志
- }
复制代码
|