|
用STM32F4的SPI+DMA讀取運(yùn)動(dòng)傳感器數(shù)據(jù),在定時(shí)中斷里控制DMA讀取傳感器的加速度計(jì),溫度,陀螺儀數(shù)據(jù),寄存器地址需要每次都發(fā)送嗎,程序會(huì)卡在ICM42605_SendByte(reg|0x80);。 while(SPI_I2S_GetFlagStatus(ICM42605_SPI,SPI_I2S_FLAG_RXNE) == RESET),接收緩存區(qū)一直不為空,有遇到的大佬嗎。幫忙指點(diǎn)下! {
if((SPITimeout--)==0) return SPI_TIMEOUT_UserCallback(1);
}
void SPI_DMA_ENABLE(void)
{
DMA_Cmd(DMA2_Stream0,DISABLE);
DMA_SetCurrDataCounter(DMA2_Stream0,SendBuff_Size);
DMA_Cmd(DMA2_Stream0,ENABLE);
DMA_Cmd(DMA2_Stream5,DISABLE);
DMA_SetCurrDataCounter(DMA2_Stream5,SendBuff_Size);
DMA_Cmd(DMA2_Stream5,ENABLE);
}
void DMA_ICM_ReadData(u8 reg,u16 NumByteToRead)
{
ICM42605_CS_LOW();
SPI1->DR;
SPI1->SR;
ICM42605_SendByte(reg|0x80);
SPI_DMA_ENABLE();
}
void DMA_SPI1_RX_IRQHANDLER(void)
{
ICM42605_CS_HIGH();
while(DMA_GetITStatus(DMA2_Stream0,DMA_IT_TCIF0)==RESET);
DMA_ClearITPendingBit(DMA2_Stream5,DMA_IT_TCIF5);
DMA_Cmd(DMA2_Stream0,DISABLE);
// printf("0");
}
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)//檢查指定的TIM中斷發(fā)生與否:TIM 中斷源
{
//讀取數(shù)據(jù)
DMA_ICM_ReadData(ICM_TEMP_OUTH_REG,SendBuff_Size);
SysTick_Delay_ms(1);
//數(shù)據(jù)合并
DATA_Combine();
LED_R_REV;
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除TIMx的中斷待處理位:TIM 中斷源
}
}
|
|