|
楼主 |
发表于 2019-12-18 00:34:18
|
显示全部楼层
本帖最后由 vvzhaodan 于 2019-12-18 00:36 编辑
视频播放方案采用 SPI_DMA
比如正在扫描缓冲区BUF1,此时DMA读取数据到BUF2,通过查询DMA读取完毕后,扫描指针指向BUF2以此交替,视频效果出来了
void LED_Show_Perioidc(void)
{
static u32 addr=0;
static u32 cnt=0;
static u8 change=1;
static u8 change2=0;
if (change>0)
{
LED_Scan_Show(APP_LED_ReadFile); //扫描显示1
if (change==1)
{
change=2;
DEV_ROM_LED_Pic_Read(addr,APP_LED_ReadFile2,sizeof(APP_LED_ReadFile2)); //读取缓冲区2
addr+=sizeof(APP_LED_ReadFile2);
if (addr>=APP_LED_PIC_Len) addr=0;
}
else if (change==2)
{
if (DEV_W25X_DMA_Read_Busy()==0) //当缓冲读取完毕更新
{
change=3;
}
}
else if (change==3)
{
if (HAL_GetTick()-cnt>=50) //50毫秒切换图片显示
{
cnt=HAL_GetTick();
change=0;
change2=1;
}
}
}
else
{
LED_Scan_Show(APP_LED_ReadFile2); //扫描显示2
if (change2==1)
{
change2=2;
DEV_ROM_LED_Pic_Read(addr,APP_LED_ReadFile,sizeof(APP_LED_ReadFile)); //读取缓冲区1
addr+=sizeof(APP_LED_ReadFile);
if (addr>=APP_LED_PIC_Len) addr=0;
}
else if (change2==2)
{
if (DEV_W25X_DMA_Read_Busy()==0) //当缓冲读取完毕更新
{
change2=3;
}
}
else if (change2==3)
{
if (HAL_GetTick()-cnt>=50) //50毫秒切换图片
{
cnt=HAL_GetTick();
change2=0;
change=1;
}
}
}
}
void DEV_W25X_DMA_Read_Wait(u32 ReadAddr, u8* pBuffer,u16 NumByteToRead)
{
u16 i=0;
u8 tx[4]={0};
if (DEV_W25X_DMA_SET_TYPE!=DEV_W25X_DMA_GET_TYPE) return;
tx[i++]=(W25X_ReadData); //发送读取命令
tx[i++]=((u8)((ReadAddr)>>16)); //发送24bit地址
tx[i++]=((u8)((ReadAddr)>>8));
tx[i++]=((u8)ReadAddr);
//memset(pBuffer,0xFF,NumByteToRead);
DEV_W25X_DMA_CS=0; //使能器件
DEV_W25X_DMA_SPI_RX_MODE(1);
DEV_W25X_DMA_SPI_TX_MODE(1);
DEV_W25X_DMA_SPI_RW_BUFF(tx,tx,4);
DEV_W25X_DMA_SPI_RX_MODE(1);
DEV_W25X_DMA_SPI_TX_MODE(0);
tx[0]=0xFF;
if (DEV_W25X_DMA_SPI_RW_BUFF_WAIT(tx,pBuffer,NumByteToRead)!=0)
{
DEV_W25X_DMA_CS=1;
return;
}
}
//等待空闲
void DEV_W25X_DMA_Wait_Busy(u32 max_outtime)
{
u32 outtime=DEV_W25X_DMA_GET_TICK_MS();
// 等待BUSY位清空
while (1)
{
if ((DEV_W25X_DMA_ReadSR()&0x01)!=0x01) return;
if (DEV_W25X_DMA_GET_TICK_MS()-outtime>=max_outtime) break;
DEV_W25X_DMA_IWDG();
}
DEV_W25X_DMA_GET_TYPE=0x00;
}
u8 BSP_SPI_SendRev(u8 id, u8 data)
{
u8 rev=0;
// u8 err=0;
u32 cnt=0;
for (cnt=0; cnt<200; cnt++)
{
if (__HAL_SPI_GET_FLAG(&BSP_SPI_Handle[id],SPI_FLAG_TXE)==0);
else break;
}
BSP_SPI[id]->DR=data;
for (cnt=0; cnt<200; cnt++)
{
if (__HAL_SPI_GET_FLAG(&BSP_SPI_Handle[id],SPI_FLAG_RXNE)==0);
else break;
}
rev=BSP_SPI[id]->DR;
//err=HAL_SPI_TransmitReceive(&BSP_SPI_Handle[id], &data, &rev, 1, 100);
return rev;
}
u32 BSP_SPI_Init(u8 id)
{
u32 err=0;
SPI_TypeDef *SPIx=BSP_SPI[id];
BSP_SPI_Handle[id].Instance = SPIx;
BSP_SPI_Handle[id].Init.Direction = SPI_DIRECTION_2LINES;
BSP_SPI_Handle[id].Init.Mode = SPI_MODE_MASTER;
BSP_SPI_Handle[id].Init.DataSize = SPI_DATASIZE_8BIT;
BSP_SPI_Handle[id].Init.CLKPolarity = SPI_POLARITY_HIGH;
BSP_SPI_Handle[id].Init.CLKPhase = SPI_PHASE_2EDGE;
BSP_SPI_Handle[id].Init.NSS = SPI_NSS_SOFT;
BSP_SPI_Handle[id].Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
BSP_SPI_Handle[id].Init.FirstBit = SPI_FIRSTBIT_MSB;
BSP_SPI_Handle[id].Init.CRCPolynomial = 7;
BSP_SPI_Handle[id].Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
BSP_SPI_Handle[id].Init.TIMode = SPI_TIMODE_DISABLE;
err=HAL_SPI_Init(&BSP_SPI_Handle[id]);
if(err!= HAL_OK) return err;
__HAL_SPI_ENABLE(&BSP_SPI_Handle[id]);
return err;
}
void BSP_SPI_DMA_SendRevBuff(u8 id, u8 *tx,u8 *rx,u16 len)
{
u32 err=0,cur_time=HAL_GetTick();
err=HAL_SPI_TransmitReceive_DMA(&BSP_SPI_Handle[id],tx,rx,len);
if (err!=HAL_OK) return;
while (1)
{
if (__HAL_DMA_GET_COUNTER(&BSP_DMA_SPI_RX_Handle[id])==len && __HAL_DMA_GET_COUNTER(&BSP_DMA_SPI_TX_Handle[id])==0) break;
if (HAL_GetTick()-cur_time>=100)
{
err=1;
break;
}
}
err=HAL_SPI_Abort(&BSP_SPI_Handle[id]);
if (err==0) return;
}
u32 BSP_SPI_DMA_SendRevBuff_Wait(u8 id, u8 *tx,u8 *rx,u16 len)
{
u32 err=0;
BSP_DMA_Send_Count=len;
err=HAL_SPI_TransmitReceive_DMA(&BSP_SPI_Handle[id],tx,rx,len);
if (err!=HAL_OK) return err;
return err;
}
u32 BSP_SPI_DMA_IS(u8 id)
{
u32 err=0;
if (__HAL_DMA_GET_COUNTER(&BSP_DMA_SPI_RX_Handle[id])==BSP_DMA_Send_Count && __HAL_DMA_GET_COUNTER(&BSP_DMA_SPI_TX_Handle[id])==0)
{
BSP_DMA_Send_Count=0;
err=HAL_SPI_Abort(&BSP_SPI_Handle[id]);
if (err!=HAL_OK) return 0;
else return 1;
}
else return 1;
}
|
|