|
现在配置了SPI2的DMA,发送功能,显示屏
目前表现在,在没用SPI的条件下,显示正常
在启用DMA后发送就有问题了,
我在程序中刷屏是普通SPI刷屏和DMA刷屏交替进行(本来想测试效果)
首先 普通SPI刷屏正常,DMA第一次发送的数据可以可以正常显示,之后,无论是普通SPI还是DMA,刷屏都不正常了
(程序中,写命令之类的是普通SPI操作,只有显示块时,大量数据才切换到DMA)
配置了不同的 SPI 波特率,出现的现象也不一样...
void Spi2Dma_Config(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
{
DMA_InitTypeDef DMA_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //使能DMA传输
DMA_DeInit(DMA_CHx); //将DMA的通道1寄存器重设为缺省值
DMA_InitStructure.DMA_PeripheralBaseAddr = cpar; //DMA外设ADC基地址
DMA_InitStructure.DMA_MemoryBaseAddr = cmar; //DMA内存基地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; //数据传输方向,从内存读取发送到外设
// DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //数据传输方向,0从外设读
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //工作在正常缓存模式
// DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //执行循环操作
DMA_InitStructure.DMA_BufferSize = cndtr; //DMA通道的DMA缓存的大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址寄存器不变
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址寄存器递增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //数据宽度为8位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //数据宽度为8位
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA通道x拥有中优先级
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA通道x没有设置为内存到内存传输
DMA_Init(DMA_CHx, &DMA_InitStructure);
}
===
#if 1 //第一次启动DMA显示正常,之后再想刷屏就有问题了
SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE);
Spi2Dma_Enable(DMA1_Channel5); //开始一次DMA传输!
while(1)
{
if(DMA_GetFlagStatus(DMA1_FLAG_TC5) != RESET) //判断通道4传输完成
{
DMA_ClearFlag(DMA1_FLAG_TC5); //清除通道4传输完成标志
break;
}
}
#else
for(i=0;i<72*72;i++)
{
//AA*****ta_16Bit(Color);
SPI_WriteByte(SPI2,gImage_7272[i*2]);
SPI_WriteByte(SPI2,gImage_7272[i*2+1]);
}
#endif |
阿莫论坛20周年了!感谢大家的支持与爱护!!
月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!
|