本帖最后由 不死鸟 于 2016-12-30 10:23 编辑
使用STM32F103VET,在调试SPI,使用DMA1Channel3进行发送,启用了DMA结束中断和DMA错误中断,但是发现无法进入中断,但是数据发送正常而且正确的,哪位大侠可以帮忙看看么,多谢了![mw_shl_code=c,true]DMA中断配置
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
DMA配置
DMA_Cmd(SPI_DMA_TX_CH, DISABLE);//关闭DMA通道
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&SPI1->DR; //DMA 的目的地址为SPI的DR
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; //传输方向是向外设写 外设为目的地
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设的地址不自增
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址自增
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //不循环
DMA_InitStructure.DMA_Priority = DMA_Priority_High; //通道优先级高
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //非存储器至存储器模式
DMA_Init(SPI_DMA_TX_CH, &DMA_InitStructure); //配置DMA1CH3
DMA_ITConfig(SPI_DMA_TX_CH,DMA1_IT_TC3 | DMA1_IT_TE3,ENABLE); //开启完成中断和传输错误中断呢
SPI_I2S_DMACmd(SPI1,SPI_I2S_DMAReq_Tx,ENABLE); //使能SPI的 DMA
DMA发送函数
int drv_SPI_DMA_Send_Data(u8 *BufferSRC, uint32_t BufferSize)
{
//SPI_DMA_Send_TX_Cfg(BufferSRC, BufferSize);
DMA_Cmd(SPI_DMA_TX_CH, DISABLE);
DMA_ITConfig(SPI_DMA_TX_CH,DMA1_IT_TC3 | DMA1_IT_TE3,ENABLE); //开启完成中断和传输错误中断呢
DMA1_Channel3->CNDTR=BufferSize; //设置要传输的数据长度
DMA1_Channel3->CMAR=(uint32_t)BufferSRC; //设置RAM缓冲区地址
DMA_Cmd(SPI_DMA_TX_CH, ENABLE);
//while(!DMA_GetFlagStatus(DMA1_FLAG_TC3)); //等待DMA通道5传输完成
//DMA_ClearFlag(DMA1_FLAG_TC3); //清除通道5传输完成状态标记
//DMA_Cmd(DMA1_Channel3,DISABLE); //
}
DMA中断处理函数
void DMA1_Channel3_IRQHandler(void)
{
if(DMA_GetITStatus(DMA1_IT_TE3))
{
iiii++;
DMA_ClearITPendingBit(DMA1_IT_TE3);
DMA_ClearFlag(DMA1_FLAG_TE3); //清除通道5传输完成状态标记
DMA_Cmd(DMA1_Channel3,DISABLE); //
}
if(DMA_GetITStatus(DMA1_IT_TC3))
{
jjjj++;
DMA_ClearITPendingBit(DMA1_IT_TC3);
DMA_ClearFlag(DMA1_FLAG_TC3); //清除通道5传输完成状态标记
DMA_Cmd(DMA1_Channel3,DISABLE); //
}
}
[/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
[mw_shl_code=c,true]void do_SPI_init()
{
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef stGPIOInit;
DMA_InitTypeDef DMA_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
stGPIOInit.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_5 ;
stGPIOInit.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
stGPIOInit.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIO_BANK_A,&stGPIOInit);
SPI_I2S_DeInit(SPI1);
SPI_StructInit(&stSPI_Init);
stSPI_Init.SPI_Direction = SPI_Direction_1Line_Tx;//单线 双向 && 输出使能 ,使处于单线发送模式 只使用spi_clk 和 mosi两根线
stSPI_Init.SPI_Mode = SPI_Mode_Master; //设置为主机
stSPI_Init.SPI_DataSize = SPI_DataSize_16b;//SPI_DataSize_8b;
stSPI_Init.SPI_CPOL = SPI_CPOL_Low; //空闲时 时钟的稳态
stSPI_Init.SPI_CPHA = SPI_CPHA_1Edge; //数据采样从第1个时钟边沿开始
stSPI_Init.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;// 波特率 = 72MHz / SPI_BaudRatePrescaler
stSPI_Init.SPI_FirstBit = SPI_FirstBit_LSB; //大端 小端模式 需要逻辑确认
stSPI_Init.SPI_CRCPolynomial = 7; //CRC校验多项式
stSPI_Init.SPI_NSS = SPI_NSS_Soft; //如果使用硬件控制模式,当NSS引脚被拉低时会产生MODF错误,所以此处应该设置为软件控制模式并将SSI为置0
SPI_Init(SPI1,&stSPI_Init); //配置SPI
SPI_Cmd(SPI1,ENABLE); //使能SPI
DMA_DeInit(DMA1_Channel3);
DMA_StructInit(&DMA_InitStructure);//初始化 结构体
DMA_Cmd(SPI_DMA_TX_CH, DISABLE);//关闭DMA通道
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&SPI1->DR; //DMA 的目的地址为SPI的DR
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; //传输方向是向外设写 外设为目的地
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设的地址不自增
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址自增
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word; //
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; //
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //不循环
DMA_InitStructure.DMA_Priority = DMA_Priority_High; //通道优先级高
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //非存储器至存储器模式
DMA_Init(SPI_DMA_TX_CH, &DMA_InitStructure); //配置DMA1CH3
DMA_ITConfig(SPI_DMA_TX_CH,DMA1_IT_TC3 | DMA1_IT_TE3,ENABLE); //开启完成中断和传输错误中断呢
SPI_I2S_DMACmd(SPI1,SPI_I2S_DMAReq_Tx,ENABLE); //使能SPI的 DMA[/mw_shl_code]
以上是SPI初始化代码,单线传输所以只用了CLK和MOSI两根线。
一周热门 更多>