[STM32L0] 单线SPI读取数据的问题

[复制链接]
2030|6
 楼主| 905105948 发表于 2017-10-10 09:45 | 显示全部楼层 |阅读模式
spi, ni, TE, TI, ST
0.jpg
如上图所示,总共读取有效数据5个,0x04-0x16,实际读取过程中,第一个CS2低电平读取的数据是CS1有效期间的数据0x12,现在的操作是在读取后面有效的5个数据之前读一次值然后丢掉,再读取5个字节就是想得到的字节了。但是总线上第一个CS2明明返回的就已经是正确的数据了,怎么处理这个问题,是配置的原因么?
单片机型号stm32l011k4t6,SPI使用单线模式,配置如下
  1. /* SPI1 parameter configuration*/
  2.   hspi1.Instance = SPI1;
  3.   hspi1.Init.Mode = SPI_MODE_MASTER;
  4.   hspi1.Init.Direction = SPI_DIRECTION_1LINE;
  5.   hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  6.   hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
  7.   hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  8.   hspi1.Init.NSS = SPI_NSS_SOFT;
  9.   hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32;
  10.   hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  11.   hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  12.   hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  13.   hspi1.Init.CRCPolynomial = 7;
  14.   if (HAL_SPI_Init(&hspi1) != HAL_OK)
  15.   {
  16.     _Error_Handler(__FILE__, __LINE__);
  17.   }
读取函数
  1. uint8_t UCB0SPI_READ(void)
  2. {
  3.                 uint8_t temp=0;
  4.     // Wait to receive a byte
  5.     HAL_SPI_Receive( &hspi1,&temp,1,5000);
  6.                 return temp;       
  7. }
发送函数
  1. void UCB0SPI_WRITE(uint8_t data)
  2. {
  3.                  
  4.     // Send byte through the SPI1 peripheral   
  5.                 HAL_SPI_Transmit(&hspi1, &data, 1, 5000);

  6. }


feelhyq 发表于 2017-10-10 10:02 | 显示全部楼层
CS1如果没用的话,始终拉高(从最开始的时候一直拉高,而不是SPI准备或者已经发数据了再拉高)
 楼主| 905105948 发表于 2017-10-10 10:26 | 显示全部楼层
feelhyq 发表于 2017-10-10 10:02
CS1如果没用的话,始终拉高(从最开始的时候一直拉高,而不是SPI准备或者已经发数据了再拉高) ...

CS1有用的,就是CS1给的配置,配置成fifo读取模式,然后才能用CS2去读取。
feelhyq 发表于 2017-10-10 10:27 | 显示全部楼层
那就在SPI发送数据之前 把CS1控制的逻辑功能做完
 楼主| 905105948 发表于 2017-10-10 10:28 | 显示全部楼层
feelhyq 发表于 2017-10-10 10:02
CS1如果没用的话,始终拉高(从最开始的时候一直拉高,而不是SPI准备或者已经发数据了再拉高) ...

我想的是是不是在接收之前读取一下DR寄存器的值,清空标志位,然后正常CS2读取的时候应该就能读到对应的字节,而不是上一次接收的字节
feelhyq 发表于 2017-10-10 10:34 | 显示全部楼层
905105948 发表于 2017-10-10 10:28
我想的是是不是在接收之前读取一下DR寄存器的值,清空标志位,然后正常CS2读取的时候应该就能读到对应的 ...

治标不治本
 楼主| 905105948 发表于 2017-10-10 10:55 | 显示全部楼层

改一下接收函数,接收之前读取一下DR,就可以了
  1. uint8_t UCB0SPI_READ(void)
  2. {
  3.                 uint8_t temp= hspi1.Instance->DR;
  4.     // Wait to receive a byte
  5.     HAL_SPI_Receive( &hspi1,&temp,1,5000);
  6.                 return temp;       
  7. }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

4

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部