新手上路
- 积分
- 42
- 金钱
- 42
- 注册时间
- 2020-3-30
- 在线时间
- 20 小时
|
24金钱
收发一体函数
void CameraSendBuff(void)
{
if(Cnt1msfFlag)
{
Cnt1msfFlag=0;
DMA_Cmd(DMA1_Stream3,DISABLE);
DMA_Cmd(DMA1_Stream4,DISABLE);
SPI2->DR;
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE)==RESET);
DMA_Cmd(DMA1_Stream3,ENABLE);
DMA_Cmd(DMA1_Stream4,ENABLE);
}
}
SPI配置
void SPI2_init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
SPI_InitTypeDef SPI_InitStruct;
NVIC_InitTypeDef NVIC_InitSTruct;
//????
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;
GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
//GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_UP;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStruct);
//NSS
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_12;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStruct);
GPIO_SetBits(GPIOB,GPIO_Pin_12);
//IO???
GPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_SPI2);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource14,GPIO_AF_SPI2);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource15,GPIO_AF_SPI2);
//SPI??
SPI_InitStruct.SPI_Mode=SPI_Mode_Master;
SPI_InitStruct.SPI_Direction=SPI_Direction_2Lines_FullDuplex;
SPI_InitStruct.SPI_CPHA=SPI_CPHA_2Edge;
SPI_InitStruct.SPI_CPOL=SPI_CPOL_High;
SPI_InitStruct.SPI_FirstBit=SPI_FirstBit_LSB;
SPI_InitStruct.SPI_DataSize=SPI_DataSize_8b;
SPI_InitStruct.SPI_NSS=SPI_NSS_Soft;
SPI_InitStruct.SPI_CRCPolynomial=7;
SPI_InitStruct.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_4;
SPI_Init(SPI2,&SPI_InitStruct);
SPI_Cmd(SPI2, DISABLE);
//DMA发送数据设置
DMA_DeInit(DMA1_Stream4);
DMA_Tx_InitStruct.DMA_Channel=DMA_Channel_0;
DMA_Tx_InitStruct.DMA_DIR=DMA_DIR_MemoryToPeripheral;
DMA_Tx_InitStruct.DMA_BufferSize=8;
DMA_Tx_InitStruct.DMA_Memory0BaseAddr=(u32)CmdTx;
DMA_Tx_InitStruct.DMA_PeripheralBaseAddr=(u32)&SPI2->DR;
DMA_Tx_InitStruct.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;
DMA_Tx_InitStruct.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;
DMA_Tx_InitStruct.DMA_MemoryInc=DMA_MemoryInc_Enable;
DMA_Tx_InitStruct.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
DMA_Tx_InitStruct.DMA_FIFOMode=DMA_FIFOMode_Disable;
DMA_Tx_InitStruct.DMA_Priority=DMA_Priority_High;
DMA_Tx_InitStruct.DMA_Mode=DMA_Mode_Normal;
DMA_Init(DMA1_Stream4,&DMA_Tx_InitStruct);
NVIC_InitSTruct.NVIC_IRQChannel=DMA1_Stream4_IRQn;
NVIC_InitSTruct.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitSTruct.NVIC_IRQChannelSubPriority=0;
NVIC_InitSTruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitSTruct);
//DMA接收数据设置
DMA_DeInit(DMA1_Stream3);
DMA_Rx_InitStruct.DMA_Channel=DMA_Channel_0;
DMA_Rx_InitStruct.DMA_DIR=DMA_DIR_PeripheralToMemory;
DMA_Rx_InitStruct.DMA_Mode=DMA_Mode_Normal;
DMA_Rx_InitStruct.DMA_BufferSize=8;
DMA_Rx_InitStruct.DMA_Priority=DMA_Priority_High;
DMA_Rx_InitStruct.DMA_Memory0BaseAddr=(u32)CmdRx;
DMA_Rx_InitStruct.DMA_PeripheralBaseAddr=(u32)&SPI2->DR;
DMA_Rx_InitStruct.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;
DMA_Rx_InitStruct.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;
DMA_Rx_InitStruct.DMA_MemoryInc=DMA_MemoryInc_Enable;
DMA_Rx_InitStruct.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
DMA_Rx_InitStruct.DMA_FIFOMode=DMA_FIFOMode_Disable;
DMA_Init(DMA1_Stream3,&DMA_Rx_InitStruct);
NVIC_InitSTruct.NVIC_IRQChannel=DMA1_Stream3_IRQn;
NVIC_InitSTruct.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitSTruct.NVIC_IRQChannelSubPriority=0;
NVIC_InitSTruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitSTruct);
SPI_I2S_DMACmd(SPI2,SPI_I2S_DMAReq_Tx,ENABLE);
SPI_I2S_DMACmd(SPI2,SPI_I2S_DMAReq_Rx,ENABLE);
DMA_ClearITPendingBit(DMA1_Stream4,DMA_IT_TCIF4|DMA_IT_DMEIF4|DMA_IT_FEIF4|DMA_IT_HTIF4|DMA_IT_TEIF4);
DMA_ITConfig(DMA1_Stream4,DMA_IT_TC,ENABLE);
DMA_ClearITPendingBit(DMA1_Stream3,DMA_IT_TCIF3|DMA_IT_DMEIF3|DMA_IT_FEIF3|DMA_IT_HTIF3|DMA_IT_TEIF4);
DMA_ITConfig(DMA1_Stream3,DMA_IT_TC,ENABLE);
DMA_Cmd(DMA1_Stream3,DISABLE);
DMA_Cmd(DMA1_Stream4,DISABLE);
SPI_Cmd(SPI2, ENABLE);
}
void DMA1_Stream3_IRQHandler(void)
{
if(DMA_GetITStatus(DMA1_Stream3,DMA_IT_TCIF3))
{
DMA_ClearITPendingBit(DMA1_Stream3,DMA_IT_TCIF3);
DMA_ClearFlag(DMA1_Stream3,DMA_FLAG_TCIF3);
// SPI2RxEndflag=1;
}
}
void DMA1_Stream4_IRQHandler(void)
{
if(DMA_GetITStatus(DMA1_Stream4,DMA_IT_TCIF4))
{
DMA_ClearITPendingBit(DMA1_Stream4,DMA_IT_TCIF4);
DMA_ClearFlag(DMA1_Stream4,DMA_IT_TCIF4);
}
}
这是用逻辑分析仪抓取的数据。下面一列是发送的数据,上面是从设备返回的数据。

但是在Keil调试时这里的数据全是0xFF

|
|