STM32 SPI3 工作在从模式接收数据偶尔出现错位的情况
主机发送数据的时序 上升沿数据有效,下降沿数据改变。CS信号没有使用,
SCK 空闲状态是0 数据采样从第一个时钟边沿开始;
时钟相位和极性设置的都是按照主机通讯协议设置的,
只用的SCLK和SDIO, 其中 SPI3通过管脚映射 SCLK 接在PC10 SDIO接PC12
配置
管脚配置情况//Enable GPIOC clock RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //Enable SPI3 clock RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE); //Enable AFIO clock RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO ,ENABLE); //remap SPI3 PC10 PC12 GPIO_PinRemapConfig(GPIO_Remap_SPI3, ENABLE);//SPI3_SCK GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //下拉输入 GPIO_Init(GPIOC, &GPIO_InitStructure); //SPI3_MOSI GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING ;//悬空输入 GPIO_Init(GPIOC, &GPIO_InitStructure);
[color=rgb(51, 102, 153) !important]复制代码
SPI部分配置 SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_RxOnly; //SPI设置为双线单向接收 SPI_InitStructure.SPI_Mode = SPI_Mode_Slave; //从模式 SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //data is 16bit //空闲状态时,SCK保持低电平 SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; // //时钟悬空为低 //数据采样从第一个时钟边沿开始; SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //数据捕获于第1个时钟沿 SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS未用,可作为通用I/O //SPI波特率 从模式可以不用管 时钟是主设备提供的 SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //数据高位在前 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPI3, &SPI_InitStructure); SPI_I2S_ITConfig(SPI3, SPI_I2S_IT_RXNE,ENABLE); /* DISABLE SPI3 */ SPI_Cmd(SPI3, DISABLE); /* Enable SPI3 */ SPI_Cmd(SPI3, ENABLE);
示波器看到的波形
在测试时,主机传输数据55H 用示波器测量输出的波形数据是正常的,
但是SPI读取的数据偶尔会出现错位的情况 比如会输出AAH 并且这种现象比较随机没有发现什么规律,请论坛的各位用过SPI从模式通讯的给一个建议,应该怎么做才可以比较稳定, |