新手上路
- 积分
- 44
- 金钱
- 44
- 注册时间
- 2021-7-11
- 在线时间
- 11 小时
|

楼主 |
发表于 2021-9-28 23:34:13
|
显示全部楼层
放弃抵抗了,那个大佬能帮忙看下。在调用TurnONSPI2DMATx后DMA传输报错了(DMA SendData Error TE)。
我在开启DMA之前是先设置好片选端口和数据命令端口,设想是传输完成后再将片选端口拉高。
LCD_CS_CLR;
LCD_RS_SET;
// SPI2_DMA_TxInit(PicSturct);
TurnONSPI2DMATx();
- *********************************************************************************************/
- void SPIModeInit(void)
- {
- DspRAMStruct PicSturct;
-
- SPI_InitTypeDef SPIInitStatus; //定义SPI结构体
- GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO初始化结构体
-
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOB, ENABLE); //配置SPI2管脚
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- //*********************************************************************
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE); //使能SPI时钟
- SPI_I2S_DeInit(SPI2); //恢复SPI为缺省状态
-
- SPIInitStatus.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //SPI 设置为双线双向全双工
- SPIInitStatus.SPI_Mode = SPI_Mode_Master; //设置为SPI主机
- SPIInitStatus.SPI_DataSize = SPI_DataSize_8b; //收发数据为8位
- SPIInitStatus.SPI_CPOL = SPI_CPOL_Low; //时钟悬空低
- SPIInitStatus.SPI_CPHA = SPI_CPHA_1Edge; //数据捕获于第一个时钟沿,即上升沿
- SPIInitStatus.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; //波特率预分频值为2
- SPIInitStatus.SPI_NSS = SPI_NSS_Soft; //内部NSS信号由SSI位控制
- SPIInitStatus.SPI_FirstBit = SPI_FirstBit_MSB; //数据传输从高位开始
- SPIInitStatus.SPI_CRCPolynomial = 7;
- SPI_Init(SPI2,&SPIInitStatus); //初始化SPI接口
- SPI_Cmd(SPI2,ENABLE); //使能 SPI
- //*********************************************************************
- // SPI_SetSpeed(SPI2,1);
- //*********************************************************************
- DMA1_NVIC_Config();
-
- PicSturct.MemoryAddress = (u32)&gImage_Pic4;
- PicSturct.PeripheralAddr = (u32)&SPI2->DR; //#define SPI2_BASE (APB2PERIPH_BASE + 0x3800)
- //0x0C 对应SPI_DR地址
- PicSturct.TxBuffSize = 65500;
- PicSturct.DataSizeType = DMA_MemoryDataSize_Byte; //数据宽度8Bit
- PicSturct.RefreshMode = DMA_Mode_Normal;
- SPI2_DMA_TxInit(PicSturct);
- //*********************************************************************
- }
- //****************************************************************************
复制代码
- //****************************************************************************
- void SPI2_DMA_TxInit(DspRAMStruct PicTableStruct)
- {
- DMA_InitTypeDef DMA_InitStruct;
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
- // delay_ms(1);
- DMA_DeInit(DMA1_Channel5);
-
- // DMA_InitStruct.DMA_PeripheralBaseAddr = PicTableStruct.PeripheralAddr; //设定外设地址
- DMA_InitStruct.DMA_PeripheralBaseAddr = 0x4000380C; //设定外设地址
- DMA_InitStruct.DMA_MemoryBaseAddr = (u32)PicTableStruct.MemoryAddress; //内存地址
- DMA_InitStruct.DMA_BufferSize =(u32)PicTableStruct.TxBuffSize; //DMA缓存大小(240*320)
- DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralDST; //传输方向:内存到外设
- DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址寄存器不变
- DMA_InitStruct.DMA_MemoryInc = DMA_PeripheralInc_Enable; //内存地址递增
- DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //外设数据宽度为8Bit
- DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //内存数据宽度为8Bit
- DMA_InitStruct.DMA_Mode = DMA_Mode_Normal; //刷新1次
- DMA_InitStruct.DMA_Priority = DMA_Priority_High; //DMA优先级为高
- DMA_InitStruct.DMA_M2M = DMA_M2M_Disable; //除能内存到内存传输
- DMA_Init(DMA1_Channel5,&DMA_InitStruct);
- SPI_I2S_DMACmd(SPI2,SPI_I2S_DMAReq_Tx,ENABLE); //选择 Tx 缓存 DMA 传输请求
- //选择 Rx 缓存 DMA 传输请求
-
- DMA_ClearFlag(DMA1_FLAG_TC5);
- DMA_ClearFlag(DMA1_FLAG_TE5);
- DMA_ITConfig(DMA1_Channel5,DMA_IT_TC,ENABLE); //传输完成中断
- DMA_ITConfig(DMA1_Channel5,DMA_IT_TE,ENABLE); //传输错误中断
- }
- //****************************************************************************
- //****************************************************************************
- void TurnONSPI2DMATx(void)
- {
- // DMA_Cmd(DMA1_Channel5,DISABLE);
- // DMA1_Channel5->CNDTR=65500; //设置要传输的数据长度
- // DMA1_Channel5->CMAR=(u32)&gImage_Pic4; //设置RAM缓冲区地址
- // SPI2->CR2 |= 1<<1;
- DMA_Cmd(DMA1_Channel5,ENABLE);
- }
- //****************************************************************************
复制代码
- //****************************************************************************
- void DMA1_Channel5_IRQHandler(void)
- {
- if(DMA_GetFlagStatus(DMA1_FLAG_TC5) == SET)
- {
- printf("\r\nDMA SendData Over\r\n");
- DMA_ClearFlag(DMA1_FLAG_TC5);
- LCD_CS_SET; //传输完成后将片选脚拉高
- }
-
- if(DMA_GetFlagStatus(DMA1_FLAG_TE5) == SET)
- {
- printf("\r\nDMA SendData Error TE \r\n");
- DMA_ClearFlag(DMA1_FLAG_TE5);
- }
-
- if(DMA_GetFlagStatus(DMA1_FLAG_GL5) == SET)
- {
- DMA_ClearFlag(DMA1_FLAG_GL5);
- }
-
- if(DMA_GetFlagStatus(DMA1_FLAG_HT5) == SET)
- {
- DMA_ClearFlag(DMA1_FLAG_HT5);
- }
-
-
- }
- //****************************************************************************
复制代码 |
|