最近公司项目需要做双STM32F4的SPI通讯,结果遇到了问题
主设备有信号发出来,但是从设备接收不到,进不了中断函数,我把SPI_I2S_ReceiveData(SPI1);单独拿出来也没有收到数据,看了一天半了,还没找到问题,希望各位朋友能提供帮助。我能确定的是我的主设备有信号发出,最后有示波器的图。
以下是从设备SPI配置代码
void SPI1_init(void)
{
SPI_InitTypeDef SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/* 开启SPI1时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
/* 开启GPIOA时钟 */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
/* 引脚复用 */
GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);
/* PA4:SS1 */
/* PA5:SCK */
/* PA6:MISO */
/* PA7:MOSI */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// SPI1_CSS_ENABLE;
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Hard;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 10;
SPI_Init(SPI1, &SPI_InitStructure);
SPI_Cmd(SPI1, ENABLE);
SPI_TIModeCmd(SPI1, ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* 使能中断函数 */
SPI_I2S_ITConfig(SPI1, SPI_I2S_IT_RXNE, ENABLE);
}
void SPI1_IRQHandler(void)
{
if(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_IT_RXNE) == SET)
{
rec = SPI_I2S_ReceiveData(SPI1);
SPI_I2S_ClearITPendingBit(SPI1, SPI_I2S_IT_RXNE);
}
}
中断进不去,rec = SPI_I2S_ReceiveData(SPI1);单独放在主程序里也没有收到东西,不知道是不是中断时钟没开还是什么,我看有些博主分享的代码,从机用硬件模式,片选是低电平……查了半天没什么结果,还请各位朋友不吝赐教,感谢各位朋友
