
我的stm32f407 spi1配置如下: void BON080_SPI1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOB, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); GPIO_Set(GPIOA,PIN2|PIN15,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_25M,GPIO_PUPD_PU); GPIO_Set(GPIOE,PIN8,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_25M,GPIO_PUPD_PU); GPIO_SetBits(GPIOE,GPIO_Pin_8); //BNO080_SPI_RESET_H() ; GPIO_Set(GPIOE,PIN12,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_25M,GPIO_PUPD_PU); GPIO_SetBits(GPIOE,GPIO_Pin_12); //BNO080_WAKE_HIGH(); GPIO_Set(GPIOB,PIN3,GPIO_Mode_AF,GPIO_OTYPE_PP,GPIO_SPEED_25M,GPIO_PUPD_PU); //PB3,CLK信号,推挽输出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; //MSPI1_MOSI PA7,SPI1_MISO PA6 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_25M; //25MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PUPD_PU; //上拉 GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GPIO_AF_SPI1); //PA6复用为 SPI1---SPI1_MISO GPIO_PinAFConfig(GPIOA,GPIO_PinSource7,GPIO_AF_SPI1); //PA7复用为 SPI1---SPI1_MOSI GPIO_PinAFConfig(GPIOB,GPIO_PinSource3,GPIO_AF_SPI1); //PB3复用为 SPI1---SPI1---CLK //SPI口初始化 SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工 SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //设置SPI工作模式:设置为主SPI SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //设置SPI的数据大小:SPI发送接收8位帧结构 SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //串行同步时钟的空闲状态为高电平 SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //串行同步时钟的第二个跳变沿(上升或下降)数据被采样 SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制 SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32; //定义波特率预分频的值:波特率预分频值为256 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始 SPI_InitStructure.SPI_CRCPolynomial = 0; //CRC值计算的多项式 0 SPI_Init(SPI1, &SPI_InitStructure); //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器 SPI_Cmd(SPI1, ENABLE); //使能SPI外设 BNO080_CHIP_DESELECT(); BON080_SPI1_ReadWriteByte(0xff); //启动传输 } 接收函数: CyBool_t BON080_SPI1_ReadByte(uint8_t *data) { uint32_t waitnum=0; while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET) { waitnum++; if(waitnum>DELAY_COUNT){ LOG("BON080_SPI1_ReadByte error"); return False; } } *data = SPI_I2S_ReceiveData(SPI1); return True; } 当外部有数据过来时,调用次函数接收数据,发现一直死在while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET)循环知道超时退出。通过查MISO线是有数据的,clk也是有波形的。为何一直卡住呢? 但是同样的spi口和函数,去读另外芯片时又能读到数据。请问卡死while循环是为啥,是检测不到miso数据吗? |
你不是双向的,光接收么??BON080_SPI1_ReadWriteByte(0xff),这个函数是不是也能读,试下这个呢? |
建议楼主做个测试,去掉超时,先调用函数,然后再发数据给F407, 看看是不是时序问题引起的![]() |
楼主你好,从配置上看到的是主机模式,如果想读取数据,主机需要先发送一个空数据,产生波形后,才能读取到数据。这个可以参考对应SPI的芯片手册,读取操作都有介绍。 |
STM32 F407骄阳电机版用DMA双缓存接收串口数据时,上电第一次接收区是memory1而不是memory0?
STM32F407骄阳版用DMA双缓存区接收串口数据,上电第一次接收到的数据在memory1而不是memory0
stm32f407无法配置定时器2为全部dma
FreeRTOS问题求解
使用stm32F407连接PHY芯片进行以太网通讯,一插网线就会进入错误中断。
ST的IMU和地磁计用motionfx库融合后航向角异常的问题
CUEBIDE生成的APP程序,在写入FLASH之后无法正常跳转。
有关Cubeide IAP 问题
stm32驱动st7735屏幕区分地图上的障碍物.
stm32cubumx使用1.28.0固件包无法初始化fsmc