博士
最后登录1970-1-1
在线时间 小时
注册时间2013-6-5
|
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);
复制代码
[size=0.83em]3 分钟前 上传
下载附件 [size=0.83em](4.57 MB)
示波器看到的波形
在测试时,主机传输数据55H 用示波器测量输出的波形数据是正常的,
但是SPI读取的数据偶尔会出现错位的情况 比如会输出AAH 并且这种现象比较随机没有发现什么规律,请论坛的各位用过SPI从模式通讯的给一个建议,应该怎么做才可以比较稳定,
|
|