eric2013 发表于 2023-8-27 00:42:37

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

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




static/image/hrline/4.gif
2023-09-01

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



tovinz 发表于 2023-8-27 23:01:43

我也打算在ESP32上整个SPI从机接口的WIFI固件。
主机通过一根中断线来判断ESP32是否需要上传数据,ESP32将这跟线拉低。
主机读取第一个数据包,ESP32通过MISO线回传的数据指示ESP32需要上传的数据量。
主机读取第二个数据包,数据量是上一个包中指示的,ESP32将数据传上来。

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

eric2013 发表于 2023-8-28 07:52:28

tovinz 发表于 2023-8-27 23:01
我也打算在ESP32上整个SPI从机接口的WIFI固件。
主机通过一根中断线来判断ESP32是否需要上传数据,ESP32将 ...

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

tovinz 发表于 2023-8-28 08:36:26

eric2013 发表于 2023-8-28 07:52
如果从机有主动上传的需求,让他做主机也行。

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

eric2013 发表于 2023-8-30 10:26:38

测试从机还有问题,下午继续搞下


tovinz 发表于 2023-8-30 16:54:30

老师,stm32h7里头spi读写数据用寄存器操作貌似和f4那些不一样
初始化的时候已经调用 __HAL_SPI_ENABLE( &SPI6_Handle ) 使能了SPI模块。
使用 HAL_SPI_TransmitReceive 读写数据没有问题
但我用f4的方式写,这个状态寄存器的状态轮询一直过不去

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;
}



eric2013 发表于 2023-8-31 00:31:12

tovinz 发表于 2023-8-30 16:54
老师,stm32h7里头spi读写数据用寄存器操作貌似和f4那些不一样
初始化的时候已经调用 __HAL_SPI_ENABLE( & ...
H7系列这么用不行,这个是H7的寄存器方式字节发送

/* 优化代码,快速操作 */
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);



tovinz 发表于 2023-9-1 09:23:35

eric2013 发表于 2023-8-31 00:31
H7系列这么用不行,这个是H7的寄存器方式字节发送

/* 优化代码,快速操作 */


谢谢老师。

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

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

eric2013 发表于 2023-9-1 09:47:50

tovinz 发表于 2023-9-1 09:23
谢谢老师。

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

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

tovinz 发表于 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讲数据包传上了

eric2013 发表于 2023-9-1 10:21:46

tovinz 发表于 2023-9-1 10:18
是这样的,不太好做。
从机有数据想要上传,而且上传的数据长度还是未知的,我感觉向STM32,ESP32单片机 ...

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

tovinz 发表于 2023-9-1 10:23:03

eric2013 发表于 2023-9-1 10:21
参考W5500的方式实现,做个类似的用法比较方便。

好,我看看,没用过这个

abcde1224 发表于 2023-9-4 22:54:29

tovinz 发表于 2023-8-27 23:01
我也打算在ESP32上整个SPI从机接口的WIFI固件。
主机通过一根中断线来判断ESP32是否需要上传数据,ESP32将 ...

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

tovinz 发表于 2023-9-5 09:58:56

abcde1224 发表于 2023-9-4 22:54
我们目前是这样的,单独用一根线代表从机有没有数据要主动上传,如果有就拉低,传完了就拉高

谢谢分享。我目前也是这样做的,效果还可以,只是ESP32的文档标称的SPI从机速率最多只有10M
页: [1]
查看完整版本: 开始整H7-TOOL的SPI控制器从机支持(2023-09-01,已经制作完毕)