我目前正在练习使用SPI + DMA将数据发送到SPI显示器。 显示的数据顺序如下:
[拉低CS]-> [拉低D / C]-> [CMD的1个SPI字节]-> [拉高D / C]-> [数据的n个SPI字节]-> [拉高CS]。 D / C引脚是GPIO引脚。
我的想法是先拉低CS和D / C,然后通过HAL_SPI_Transmit_IT();发送1字节的CMD HAL_SPI_Transmit_IT(); 然后将D / C引脚拉高,并在SPI中断程序中开始DMA传输。 并且在DMA TxComplete中断中CS引脚将被拉高。
我的SPI的数据长度设置为8位,而DMA设置是存储到外设和增量模式的存储器。
我正在使用cubeMX生成代码,这大致是我的代码:
uint8_t displayData[DIS_DATA_BUFF_SIZE];
int main(void)
{
...init stuff from cubeMX
cmdBuffer[0].cmd = 0xAA;
cmdBuffer[0].amountOfData = 10;
cmdBuffer[0].pDataStart = displayData;
while (1)
{
HAL_Delay(500);
cmdBuffer[0].status = IN_USE;
pExecuteCmd = &cmdBuffer[0];
SPI_START();
DIS_CMD_MODE_ON();
HAL_SPI_Transmit_IT(&hspi2, &pExecuteCmd->cmd, 1);
}
}
这是我的SPI中断例程
void SPI2_IRQHandler(void)
{
/* USER CODE BEGIN SPI2_IRQn 0 */
uint8_t startDMA = 0;
if(__HAL_SPI_GET_FLAG(&hspi2, SPI_FLAG_TXE)){
if(pExecuteCmd->status == EXE_CMD){
DIS_CMD_MODE_OFF();
if(pExecuteCmd->amountOfData == 0){
SPI_END();
pExecuteCmd->status = EMPTY;
}else{