SPI 片选是怎么拉的,求大佬指导

[复制链接]
1137|15
手机看帖
扫描二维码
随时随地手机跟帖
发发打发|  楼主 | 2021-5-20 16:27 | 显示全部楼层 |阅读模式
我使用硬件输出模式,用gpio来上下拉片选,可以成功上下拉。但是我在调用spi发送函数的前后拉低,拉高片选的时候,片选在我数据没发完的时候就拉高了,这该怎么解决

使用特权

评论回复
LcwSwust| | 2021-5-20 16:34 | 显示全部楼层
有程序吗?有等待发完吗?有测量波形吗?

使用特权

评论回复
发发打发|  楼主 | 2021-5-21 09:26 | 显示全部楼层
LcwSwust 发表于 2021-5-20 16:34
有程序吗?有等待发完吗?有测量波形吗?

使用特权

评论回复
发发打发|  楼主 | 2021-5-21 09:27 | 显示全部楼层
发发打发|  楼主 | 2021-5-21 09:27 | 显示全部楼层
LcwSwust 发表于 2021-5-20 16:34
有程序吗?有等待发完吗?有测量波形吗?

使用特权

评论回复
发发打发|  楼主 | 2021-5-21 09:29 | 显示全部楼层
LcwSwust 发表于 2021-5-20 16:34
有程序吗?有等待发完吗?有测量波形吗?

这是我的波形图和程序,我等待了也没有用,用延时可以但是时间太长了

使用特权

评论回复
LcwSwust| | 2021-5-21 09:52 | 显示全部楼层
发发打发 发表于 2021-5-21 09:29
这是我的波形图和程序,我等待了也没有用,用延时可以但是时间太长了

光等待TBE标志是不够的,下面是例程中的函数:
/* Exchange a byte */
static
BYTE xchg_spi (
        BYTE dat        /* Data to send */
)
{
        while(RESET == spi_i2s_flag_get(SPI1, SPI_FLAG_TBE));
        spi_i2s_data_transmit(SPI1, dat);
        while(RESET == spi_i2s_flag_get(SPI1, SPI_FLAG_RBNE));
        return(spi_i2s_data_receive(SPI1));     /* Return received byte */
}

使用特权

评论回复
tj250460882| | 2021-5-21 10:32 | 显示全部楼层
本帖最后由 tj250460882 于 2021-5-21 10:47 编辑

判断有问题,发送缓冲区为空,并不代表数据已经发送完成,还需要判断接收缓冲区不为空
  while (spi_i2s_flag_get(SPI1, SPI_FLAG_TBE) == RESET){}
        
        spi_i2s_data_transmit(SPI1, TxData);
               
  while (spi_i2s_flag_get(SPI1, SPI_FLAG_RBNE) == RESET){}

        return spi_i2s_data_receive(SPI1);
这个才能保证数据完全发送完成。

使用特权

评论回复
发发打发|  楼主 | 2021-5-21 10:34 | 显示全部楼层
本帖最后由 发发打发 于 2021-5-21 10:43 编辑
LcwSwust 发表于 2021-5-21 09:52
光等待TBE标志是不够的,下面是例程中的函数:

我试一下

使用特权

评论回复
发发打发|  楼主 | 2021-5-21 10:48 | 显示全部楼层
tj250460882 发表于 2021-5-21 10:32
判断有问题,发送缓冲区为空,并不代表数据已经发送完成,还需要判断接收缓冲区不为空
  while (spi_i2s_f ...

我试了一下,是一样的,不过,第一个包确实等待了,后面还是一样

使用特权

评论回复
tj250460882| | 2021-5-21 10:53 | 显示全部楼层
发发打发 发表于 2021-5-21 10:48
我试了一下,是一样的,不过,第一个包确实等待了,后面还是一样

uint8_t SPI1_ReadWriteByte(uint8_t TxData)
{                                          

  while (spi_i2s_flag_get(SPI1, SPI_FLAG_TBE) == RESET){}
       
        spi_i2s_data_transmit(SPI1, TxData);
               
  while (spi_i2s_flag_get(SPI1, SPI_FLAG_RBNE) == RESET){}

        return spi_i2s_data_receive(SPI1);
                    
}
发送和接收都是用这个函数实现的,发送时就写入要发送的数据,接收时直接写0xFF。我用SPI操作AD7795是正常的。你这个代码里面是不是除了发送还有接收部分。

使用特权

评论回复
发发打发|  楼主 | 2021-5-21 11:04 | 显示全部楼层
tj250460882 发表于 2021-5-21 10:53
uint8_t SPI1_ReadWriteByte(uint8_t TxData)
{                                          

对我也是AD芯片,除了写函数,还有个读函数

使用特权

评论回复
发发打发|  楼主 | 2021-5-21 11:05 | 显示全部楼层
发发打发 发表于 2021-5-21 11:04
对我也是AD芯片,除了写函数,还有个读函数

我试一下用你说的方法

使用特权

评论回复
发发打发|  楼主 | 2021-5-21 11:19 | 显示全部楼层
tj250460882 发表于 2021-5-21 10:53
uint8_t SPI1_ReadWriteByte(uint8_t TxData)
{                                          

你的片选是像gd例程里那么设置的吗

使用特权

评论回复
tj250460882| | 2021-5-21 11:20 | 显示全部楼层
发发打发 发表于 2021-5-21 11:19
你的片选是像gd例程里那么设置的吗

自己用普通IO,拉高拉低的。

使用特权

评论回复
yuayuuu| | 2021-5-25 16:04 | 显示全部楼层
tj250460882 发表于 2021-5-21 10:32
判断有问题,发送缓冲区为空,并不代表数据已经发送完成,还需要判断接收缓冲区不为空
  while (spi_i2s_f ...

判断了这两个标致,应该没啥问题的。

使用特权

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

本版积分规则

8

主题

33

帖子

0

粉丝