硬汉嵌入式论坛

 找回密码
 立即注册
查看: 812|回复: 13
收起左侧

[SPI控制器] 开始整H7-TOOL的SPI控制器从机支持(2023-09-01,已经制作完毕)

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106828
QQ
发表于 2023-8-27 00:42:37 | 显示全部楼层 |阅读模式
I2C控制器的从机的LUA API已经弄好。开始弄SPI控制器的从机支持。SPI从机与I2C的情况一样,从机去年就弄好了,一直没有整理到TOOL上

H7-TOOL的SPI控制器主从机操作说明,20cm杜邦线接线方式,SPI全双工25MHz通信速度(2022-04-10)
https://www.armbbs.cn/forum.php?mod=viewthread&tid=111864

下载.png



2023-09-01

当前已经制作完成从机模式。



回复

使用道具 举报

19

主题

234

回帖

291

积分

高级会员

积分
291
发表于 2023-8-27 23:01:43 | 显示全部楼层
我也打算在ESP32上整个SPI从机接口的WIFI固件。
主机通过一根中断线来判断ESP32是否需要上传数据,ESP32将这跟线拉低。
主机读取第一个数据包,ESP32通过MISO线回传的数据指示ESP32需要上传的数据量。
主机读取第二个数据包,数据量是上一个包中指示的,ESP32将数据传上来。

跟串口相比,不说速度,就分包来说,SPI通过CS线来分包,比串口的空闲分包或者特定数据分包更有效率
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106828
QQ
 楼主| 发表于 2023-8-28 07:52:28 | 显示全部楼层
tovinz 发表于 2023-8-27 23:01
我也打算在ESP32上整个SPI从机接口的WIFI固件。
主机通过一根中断线来判断ESP32是否需要上传数据,ESP32将 ...

如果从机有主动上传的需求,让他做主机也行。
回复

使用道具 举报

19

主题

234

回帖

291

积分

高级会员

积分
291
发表于 2023-8-28 08:36:26 | 显示全部楼层
eric2013 发表于 2023-8-28 07:52
如果从机有主动上传的需求,让他做主机也行。

这倒是个办法哎,就省去了需要先检查需要传输多少个字节这个步骤了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106828
QQ
 楼主| 发表于 2023-8-30 10:26:38 | 显示全部楼层
测试从机还有问题,下午继续搞下

下载.png
回复

使用道具 举报

19

主题

234

回帖

291

积分

高级会员

积分
291
发表于 2023-8-30 16:54:30 | 显示全部楼层
老师,stm32h7里头spi读写数据用寄存器操作貌似和f4那些不一样
初始化的时候已经调用 __HAL_SPI_ENABLE( &SPI6_Handle ) 使能了SPI模块。
使用 HAL_SPI_TransmitReceive 读写数据没有问题
但我用f4的方式写,这个状态寄存器的状态轮询一直过不去

[C] 纯文本查看 复制代码
unsigned char bsp_spi6_byte_wr ( unsigned char write )
{
  volatile uint32_t timeout;

  timeout = 0xFFFFFF;
  while ( (SPI6->SR & SPI_SR_TXP) == 0 )
  {
    if ( --timeout == 0 )
    {
      return 0;
    }
  }
  SPI6->TXDR = write;

  timeout = 0xFFFFFF;
  while ( (SPI6->SR & SPI_SR_RXP) ==  0 )
  {
    if ( --timeout == 0 )
    {
      return 0;
    }
  }

  return SPI6->RXDR;
}



回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106828
QQ
 楼主| 发表于 2023-8-31 00:31:12 | 显示全部楼层
tovinz 发表于 2023-8-30 16:54
老师,stm32h7里头spi读写数据用寄存器操作貌似和f4那些不一样
初始化的时候已经调用 __HAL_SPI_ENABLE( & ...

H7系列这么用不行,这个是H7的寄存器方式字节发送

[C] 纯文本查看 复制代码
/* 优化代码,快速操作 */
static void ST7789_SendByteQuick(uint8_t data)
{
	SPI5->CFG1 = SPI_BAUDRATEPRESCALER_8 | 7;
    SPI5->CR1 = SPI_CR1_SSI;
    SPI5->CR2 = 1;
    SPI5->CR1 = SPI_CR1_SPE | SPI_CR1_SSI;
    SPI5->CR1 = SPI_CR1_SPE | SPI_CR1_SSI | SPI_CR1_CSTART;

    while ((SPI5->SR & SPI_FLAG_TXE) == 0);

    *((__IO uint8_t *)&SPI5->TXDR) = data;
	
    while ((SPI5->SR & SPI_SR_TXC) == 0);
	
    SPI5->IFCR = SPI_IFCR_EOTC | SPI_IFCR_TXTFC;
	
	SPI5->CR1 &= ~(SPI_CR1_SPE);
)



回复

使用道具 举报

19

主题

234

回帖

291

积分

高级会员

积分
291
发表于 2023-9-1 09:23:35 | 显示全部楼层
eric2013 发表于 2023-8-31 00:31
H7系列这么用不行,这个是H7的寄存器方式字节发送

[mw_shl_code=c,true]/* 优化代码,快速操作 */

谢谢老师。

用单片机做spi从机,是不是没有办法像W25Q64这种纯硬件的一样,第一个字节是主机的读数据命令,后面的字节从机就回数据。

您说的主从模式切换感我没怎么想好,现在的想法是
  从机将中断线拉低指示主机需要读取从机的数据了,从机这时候应该是不是离开切换为SPI主模式,这时候如果主机刚好有数据发送过来就冲突了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106828
QQ
 楼主| 发表于 2023-9-1 09:47:50 | 显示全部楼层
tovinz 发表于 2023-9-1 09:23
谢谢老师。

用单片机做spi从机,是不是没有办法像W25Q64这种纯硬件的一样,第一个字节是主机的读数据 ...

1、像W25Q64这样的从机是没问题的。
2、如果处理及时些,就用中断线吧,否则谁做从机都没直接通知。
回复

使用道具 举报

19

主题

234

回帖

291

积分

高级会员

积分
291
发表于 2023-9-1 10:18:29 | 显示全部楼层
eric2013 发表于 2023-9-1 09:47
1、像W25Q64这样的从机是没问题的。
2、如果处理及时些,就用中断线吧,否则谁做从机都没直接通知。

是这样的,不太好做。
从机有数据想要上传,而且上传的数据长度还是未知的,我感觉向STM32,ESP32单片机的SPI不太好实现边收发数据,边判断接收的数据是什么

我想了想还是按先前的做法,STM32完全掌控SPI总线的控制权。
STM32想向ESP32发送数据,那就正常调用SPI接口,CS拉低拉高传输数据。
ESP32有数据想要传给STM32时,将这个数据包丢到队列中,将中断线拉低通知STM32来读取数据,STM32检测到中断,通过线程标志将中断事件传到线程里头,

  第一个包STM32通过MOSI先发送指令用于查询ESP32想要上传的数据的数量,第二个包ESP32通过MISO告知STM32需要上传的数据量,第三个包ESP32通过MISO讲数据包传上了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106828
QQ
 楼主| 发表于 2023-9-1 10:21:46 | 显示全部楼层
tovinz 发表于 2023-9-1 10:18
是这样的,不太好做。
从机有数据想要上传,而且上传的数据长度还是未知的,我感觉向STM32,ESP32单片机 ...

参考W5500的方式实现,做个类似的用法比较方便。
回复

使用道具 举报

19

主题

234

回帖

291

积分

高级会员

积分
291
发表于 2023-9-1 10:23:03 | 显示全部楼层
eric2013 发表于 2023-9-1 10:21
参考W5500的方式实现,做个类似的用法比较方便。

好,我看看,没用过这个
回复

使用道具 举报

7

主题

190

回帖

216

积分

高级会员

积分
216
发表于 2023-9-4 22:54:29 | 显示全部楼层
tovinz 发表于 2023-8-27 23:01
我也打算在ESP32上整个SPI从机接口的WIFI固件。
主机通过一根中断线来判断ESP32是否需要上传数据,ESP32将 ...

我们目前是这样的,单独用一根线代表从机有没有数据要主动上传,如果有就拉低,传完了就拉高
回复

使用道具 举报

19

主题

234

回帖

291

积分

高级会员

积分
291
发表于 2023-9-5 09:58:56 | 显示全部楼层
abcde1224 发表于 2023-9-4 22:54
我们目前是这样的,单独用一根线代表从机有没有数据要主动上传,如果有就拉低,传完了就拉高

谢谢分享。我目前也是这样做的,效果还可以,只是ESP32的文档标称的SPI从机速率最多只有10M
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-6 13:31 , Processed in 0.293329 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表