硬汉嵌入式论坛

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

[LUA教程] H7-TOOL的LUA小程序教程第11期:SPI总线从机模式操作说明V2.0 (2025-01-27)

[复制链接]

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115455
QQ
发表于 2023-12-3 09:59:06 | 显示全部楼层 |阅读模式
LUA脚本的好处是用户可以根据自己注册的一批API(当前TOOL已经提供了几百个函数供大家使用),实现各种小程序,不再限制Flash里面已经下载的程序,就跟手机安装APP差不多,所以在H7-TOOL里面被广泛使用,支持在线调试运行,支持离线运行。

TOOL的LUA教程争取做到大家可以无痛调用各种功能函数,不需要学习成本。


功能特性:

1、从机采用硬件SPI实现,主机对其写操作可以支持50MHz(50MHz-60MHz),主机对其读操作可以支持12.5MHz(12.5-20MHz),支持从机的SPI速度是由主机决定的,使用时,不需要大家配置。
2、IO电平范围支持1.2V-5.0V。
3、使用从机模式要特别注意一点,这个是硬件SPI特性决定的,主从机发起通信前,一定要保证主从机GPIO已经正确配置了SPI引脚复用状态,否则从机不会等待主机发起操作,会立即返回。
4、支持波形展示。

LUA函数说明:

1、从机初始化函数

spi_bus("initslave", 参数1, 参数2, 参数3,  参数4)

参数1:配置SPI时钟相位
0表示上升沿采集数据
1表示下降沿采集数据

参数2:配置SPI时钟极性
0表示空闲时SCK时钟是低电平
1表示空闲时SCK时钟是高电平

参数3:读写超时时间,单位ms,对从机的读函数和写函数起作用,表示在设置的时间内,SPI从机没有完成数据发送或者接收,将立即返回。

参数4:数据bit选择(可选,如果不填写这个选项,默认8bit)
8表示SPI的8bit数据通信
16表示SPI的16bit数据通信

比如配置上升沿采集,SCK空闲时低电平,读写超时时间5000ms,8bit数据通信,可以单独LUA调用spi_bus("initslave", 0, 0, 5000)或者spi_bus("initslave", 0, 0, 5000, 8)

也可以使用TOOL上位机操作:

2345.jpg

2、从机接受数据函数

返回值 = spi_bus("recive", 参数)
返回值:读取数据
参数   :要读取的数据个数

比如要读取10个数据,就可以rd = spi_bus("recive", 10),可以单独LUA调用

也可以上位机操作

1.png

3、从机发送数据函数

spi_bus("send", 参数)

参数:发送的数据,可以发送字符串比如"12345678", 如果要发送实际数值,可以转移字符比如"\x00\x12\x34\x56"

比如要写10个数据,就可以spi_bus("send", "1234567890") ,可以单独LUA调用

也可以上位机操作

下载 (4).png

4、从机全双工读写函数

返回值 = spi_bus("sendrecive", 参数1, 参数2)

参数1:  发送的数据,可以发送字符串比如"12345678",  如果要发送实际数值,可以转移字符比如"\x00\x12\x34\x56"

参数2:数据长度,全双工方式,发送和接受数据长度是一样的,注意和参数1的字符数据个数一致。无论是8bit还是16bit个数数据,这个参数的单位是字节

返回值:返回读取的数据。

比如16bit模式,发送数据12个字节数据(每两个字节数据是一个16bit,如果与实际芯片通信,注意这两个字节的顺序,也就是大小端格式):\xdd\x22\x33\x44\x55\x66\x77\x88\x99\xAA\xBB\xCC , 主机返回数据:\x11\x22\x33\x44\x55\x66\x77\x88\x99\xAA\xBB\xCC

[Lua] 纯文本查看 复制代码
spi_bus("initslave", 0, 0, 5000, 16) --phase, polarity, timeout
print("")
print("SPI从机准备就绪")
print("接收")
rd = spi_bus("sendrecive", "\xdd\x22\x33\x44\x55\x66\x77\x88\x99\xAA\xBB\xCC", 12)
print_hex(rd)
print("SPI从机已退出")




5、主机卸载函数

spi_bus("uninit")

直接调用函数spi_bus("uninit")即可,也可以上位机操作:

1.png

硬件接线连接:

SPI从机引脚定义,不需要片选
D5 : SCK 时钟
D2 : SDO MOSI
D3 : SDI MISO

接主机的话,接线方式如下:

下载 (5).png

使用举例:

举例1:配置上升沿采集数据,空闲时SCK是低电平,等待超时时间是5000ms,接受主机发送10个字节数据,注意要主机发起操作,从机不能主动发起操作

12.png

举例2:配置上升沿采集数据,空闲时SCK是低电平,等待超时时间是5000ms,给主机发送10个字节数据,注意要主机发起操作,从机不能主动发起操作

123.png

举例3:两个TOOL的SPI控制器做16bit通信,全双工方式

主机添加如下代码:

[Lua] 纯文本查看 复制代码
spi_bus("init", 5, 0, 0, 16)
rd = spi_bus("sendrecive", "\x11\x22\x33\x44\x55\x66\x77\x88\x99\xAA\xBB\xCC", 12)
print_hex(rd)


从机添加如下代码,设置超时时间是5秒

[Lua] 纯文本查看 复制代码
spi_bus("initslave", 0, 0, 5000, 16) --phase, polarity, timeout
print("")
print("SPI从机准备就绪")
print("接收")
rd = spi_bus("sendrecive", "\xdd\x22\x33\x44\x55\x66\x77\x88\x99\xAA\xBB\xCC", 12)
print_hex(rd)
print("SPI从机已退出")




测试时,优先执行从机,让从机进入等待通信状态,然后执行主机发起全双工操作即可

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115455
QQ
 楼主| 发表于 2023-12-4 01:22:42 | 显示全部楼层
更新完成。
回复

使用道具 举报

0

主题

19

回帖

19

积分

新手上路

积分
19
发表于 2024-1-2 14:34:33 | 显示全部楼层
请问一下上述的lua的脚本可以调试吗?如果可以的话,应该使用什么工具或者IDE进行调试呢?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115455
QQ
 楼主| 发表于 2024-1-2 14:44:33 | 显示全部楼层
hijkstra 发表于 2024-1-2 14:34
请问一下上述的lua的脚本可以调试吗?如果可以的话,应该使用什么工具或者IDE进行调试呢?

TOOL上位机就可以调试,出错会提示错误信息

下载 (1).png



回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
发表于 2024-1-2 17:58:00 | 显示全部楼层
硬汉哥,强烈期盼H7tool的LUA API  for CAN
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115455
QQ
 楼主| 发表于 2024-1-3 08:03:19 | 显示全部楼层
fly0315 发表于 2024-1-2 17:58
硬汉哥,强烈期盼H7tool的LUA API  for CAN

就是这个帖子。

H7-TOOL的CANFD/CAN接口脱机烧写操作说明,  已经更新(2022-07-12)
https://www.armbbs.cn/forum.php?mod=viewthread&tid=113770
回复

使用道具 举报

0

主题

19

回帖

19

积分

新手上路

积分
19
发表于 2024-1-12 14:36:28 | 显示全部楼层
eric2013 发表于 2024-1-2 14:44
TOOL上位机就可以调试,出错会提示错误信息

谢谢,请问H7-tool的lua,可以单步运行,设置断点,观察变量数值吗?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115455
QQ
 楼主| 发表于 2024-1-13 09:00:32 | 显示全部楼层
hijkstra 发表于 2024-1-12 14:36
谢谢,请问H7-tool的lua,可以单步运行,设置断点,观察变量数值吗?

这个没必要单步和设置断点,因为一个LUA函数底层封装了很多C函数的,所以LUA端的代码量非常小。

大家可以运行部分代码排查即可。
回复

使用道具 举报

0

主题

19

回帖

19

积分

新手上路

积分
19
发表于 2024-1-15 08:15:03 | 显示全部楼层
eric2013 发表于 2024-1-13 09:00
这个没必要单步和设置断点,因为一个LUA函数底层封装了很多C函数的,所以LUA端的代码量非常小。

大家 ...

ok
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115455
QQ
 楼主| 发表于 2024-10-18 00:15:45 | 显示全部楼层
测试一个H7-TOOL做从机,V7开发板做主机的测试。

1、V7板子运行的原始例子 V7-070_SPI DMA双机通信(主机),未做任何修改。

2、接线情况



接线实物图:



3、板子和TOOL接好线,都上电,  然后TOOL的上位机配置如下:





实际效果如下:

点击上位机的执行按钮后,5秒内按下V7开发板的K1按键,会看到V7开发板发送过来的4个字节数据0,1,2,3



多执行几次



[C] 纯文本查看 复制代码
/*
*********************************************************************************************************
*
*        模块名称 : SPI 主机
*        文件名称 : demo_spi_master.c
*        版    本 : V1.0
*        说    明 : SPI 主机
*                _________________________                        _____________________________
*                |           ______________|                      |______________________       |
*                |          |     SPI1     |                      |        SPI1          |      |
*                |          |              |                      |                      |      |
*                |          |     CLK(PB3) |______________________|(PB3)CLK              |      |
*                |          |              |                      |                      |      |
*                |          |    MISO(PB4) |______________________|(PB4)MISO             |      |
*                |          |              |                      |                      |      |
*                |          |    MOSI(PB5) |______________________|(PB5)MOSI             |      |
*                |          |              |                      |                      |      |
*                |          |    NSS(PG10) |______________________|(PG10)NSS             |      |
*                |          |______________|                      |______________________|      |
*                |                         |                      |                             |
*                |                         |                      |                             |
*                |                         |                      |                             |
*                |                      GND|______________________|GND                          |
*                |                         |                      |                             |
*                |_STM32H7 Master _________|                      |_STM32H7 Slave ______________|
*     
*        修改记录 :
*                版本号  日期        作者     说明
*                V1.0    2022-04-08 Eric2013  正式发布
*
*        Copyright (C), 2020-2030, 安富莱电子 [url=http://www.armfly.com]www.armfly.com[/url]
*
*********************************************************************************************************
*/
#include "demo_spi_master.h"
#include "bsp.h"
 
 
static void sfDispMenu(void);
 
/*
*********************************************************************************************************
*        函 数 名: DemoSpiMaster
*        功能说明: SPI 主机通信
*        形    参:无
*        返 回 值: 无
*********************************************************************************************************
*/
void DemoSpiMaster(void)
{
        uint8_t count = 0;
    uint8_t ucKeyCode;                /* 按键代码 */
     
    /***************设置SPI Flash片选上拉,防止影响 ***************/
    {
        GPIO_InitTypeDef gpio_init;
 
        /* 打开GPIO时钟 */
        __HAL_RCC_GPIOD_CLK_ENABLE();
         
        gpio_init.Mode = GPIO_MODE_OUTPUT_PP;        
        gpio_init.Pull = GPIO_NOPULL;                
        gpio_init.Speed = GPIO_SPEED_HIGH;          
        gpio_init.Pin = GPIO_PIN_13;        
        HAL_GPIO_Init(GPIOD, &gpio_init);
 
        GPIOD->BSRR = GPIO_PIN_13;
    }
     
        sfDispMenu();                /* 打印命令提示 */
         
        bsp_StartAutoTimer(0, 100);        /* 启动1个100ms的自动重装的定时器 */
         
        while(1)
        {
                bsp_Idle();                /* 这个函数在bsp.c文件。用户可以修改这个函数实现CPU休眠和喂狗 */
                 
                /* 判断定时器超时时间 */
                if (bsp_CheckTimer(0))        
                {
                        /* 每隔100ms 进来一次 */ 
                        bsp_LedToggle(2);
                }
         
        /* 按键滤波和检测由后台systick中断服务程序实现,我们只需要调用bsp_GetKey读取键值即可。 */
                ucKeyCode = bsp_GetKey();        /* 读取键值, 无键按下时返回 KEY_NONE = 0 */
                if (ucKeyCode != KEY_NONE)
                {
                        switch (ucKeyCode)
                        {
                                case KEY_DOWN_K1:                        /* K1键按下,发送数据给从机*/
                    g_spiTxBuf[0] = count++;
                    g_spiTxBuf[1] = count++;
                    g_spiTxBuf[2] = count++;
                    g_spiTxBuf[3] = count++;
                    g_spiLen = 4;
                    printf("SPI主机发送数据:%d,%d,%d,%d\r\n", g_spiTxBuf[0],g_spiTxBuf[1],g_spiTxBuf[2],g_spiTxBuf[3]);
                    bsp_spiTransfer();
                    printf("SPI主机接收数据:%d,%d,%d,%d\r\n", g_spiRxBuf[0],g_spiRxBuf[1],g_spiRxBuf[2],g_spiRxBuf[3]);
                                        break;
 
                                default:
                                        /* 其它的键值不处理 */
                                        break;
                        }
                 
                }
        }
}
 
/*
*********************************************************************************************************
*        函 数 名: sfDispMenu
*        功能说明: 显示操作提示菜单
*        形    参:无
*        返 回 值: 无
*********************************************************************************************************
*/
static void sfDispMenu(void)
{
        printf("SPI主机程序\r\n");
        printf("K1按键按下,SPI主机开启SPI全双工通信\r\n");
}
 
/***************************** 安富莱电子 [url=http://www.armfly.com]www.armfly.com[/url] (END OF FILE) *********************************/

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115455
QQ
 楼主| 发表于 2025-1-27 11:56:02 | 显示全部楼层

更新全双工API和8bit,16bit选项
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-26 19:18 , Processed in 0.306512 second(s), 31 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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