打印
[STM32L0]

单线SPI读取数据

[复制链接]
821|26
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huanghuac|  楼主 | 2020-12-15 18:53 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
总共读取有效数据5个,0x04-0x16,实际读取过程中,第一个CS2低电平读取的数据是CS1有效期间的数据0x12,现在的操作是在读取后面有效的5个数据之前读一次值然后丢掉,再读取5个字节就是想得到的字节了。但是总线上第一个CS2明明返回的就已经是正确的数据了,怎么处理这个问题,是配置的原因么?

使用特权

评论回复
沙发
huanghuac|  楼主 | 2020-12-15 18:57 | 只看该作者

使用特权

评论回复
板凳
houcs| | 2020-12-15 19:01 | 只看该作者
楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
地板
huanghuac|  楼主 | 2020-12-15 19:07 | 只看该作者
/* SPI1 parameter configuration*/
  hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_MASTER;
  hspi1.Init.Direction = SPI_DIRECTION_1LINE;
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi1.Init.NSS = SPI_NSS_SOFT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32;
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi1.Init.CRCPolynomial = 7;
  if (HAL_SPI_Init(&hspi1) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

使用特权

评论回复
5
huanghuac|  楼主 | 2020-12-15 19:13 | 只看该作者

uint8_t UCB0SPI_READ(void)
{
                uint8_t temp=0;
    // Wait to receive a byte
    HAL_SPI_Receive( &hspi1,&temp,1,5000);
                return temp;        
}

使用特权

评论回复
6
huanghuac|  楼主 | 2020-12-15 19:16 | 只看该作者

void UCB0SPI_WRITE(uint8_t data)
{
                 
    // Send byte through the SPI1 peripheral   
                HAL_SPI_Transmit(&hspi1, &data, 1, 5000);

}发送函数

使用特权

评论回复
7
yinxiangh| | 2020-12-15 19:19 | 只看该作者
CS1如果没用的话,始终拉高(从最开始的时候一直拉高,而不是SPI准备或者已经发数据了再拉高)

使用特权

评论回复
8
huanghuac|  楼主 | 2020-12-15 19:23 | 只看该作者
CS1有用的,就是CS1给的配置,配置成fifo读取模式,然后才能用CS2去读取。

使用特权

评论回复
9
chenjunt| | 2020-12-15 19:26 | 只看该作者
那就在SPI发送数据之前 把CS1控制的逻辑功能做完

使用特权

评论回复
10
huanghuac|  楼主 | 2020-12-15 19:30 | 只看该作者
我想的是是不是在接收之前读取一下DR寄存器的值,清空标志位,然后正常CS2读取的时候应该就能读到对应的字节,而不是上一次接收的字节

使用特权

评论回复
11
tian111| | 2020-12-15 19:36 | 只看该作者
治标不治本

使用特权

评论回复
12
huanghuac|  楼主 | 2020-12-15 19:39 | 只看该作者
改一下接收函数,接收之前读取一下DR,就可以了

使用特权

评论回复
13
huanghuac|  楼主 | 2020-12-15 19:42 | 只看该作者

uint8_t UCB0SPI_READ(void)
{
                uint8_t temp= hspi1.Instance->DR;
    // Wait to receive a byte
    HAL_SPI_Receive( &hspi1,&temp,1,5000);
                return temp;        
}

使用特权

评论回复
14
llljh| | 2020-12-15 19:46 | 只看该作者
适当的延时一下试试呢

使用特权

评论回复
15
renyaq| | 2020-12-15 19:50 | 只看该作者
把速度降下来试试看

使用特权

评论回复
16
xxrs| | 2020-12-15 19:53 | 只看该作者
是不是缓存那处理的不好呢

使用特权

评论回复
17
ousj| | 2020-12-15 20:00 | 只看该作者
从时序上看不出来什么问题啊

使用特权

评论回复
18
kangzj| | 2020-12-15 20:04 | 只看该作者
有没有可能在处理数据的时候丢掉了一些有用数据啊

使用特权

评论回复
19
yufe| | 2020-12-15 20:07 | 只看该作者
函数处理上有没有什么重大延时啊

使用特权

评论回复
20
langgq| | 2020-12-15 20:11 | 只看该作者
SPI用的不多,一起学习下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

772

主题

8473

帖子

6

粉丝