首页 > 其他分享 >CH57x,CH58x,CH59x芯片_SPI借助GPIO中断完成中断传输

CH57x,CH58x,CH59x芯片_SPI借助GPIO中断完成中断传输

时间:2024-03-22 10:13:14浏览次数:15  
标签:CH57x 12 Pin 中断 主机 CH59x SPI GPIOA GPIO

受其他项目的启发,如果IO充裕,且在SPI主机与SPI从机均可以自行编程的情况下,可以尝试在4线SPI的基础上增加两根GPIO线,通过IO中断的形式通知对方进行收数据;

非SPI中断形式,以两颗CH582通讯为例,

1、主机程序:

void main()
{
    SetSysClock(CLK_SOURCE_PLL_60MHz);

    GPIOA_ModeCfg(GPIO_Pin_0,GPIO_ModeOut_PP_5mA);
    GPIOA_SetBits(GPIO_Pin_0);//初始化PA0作为输出引脚,默认输出高电平,等到需要发数据时使PA0输出低电平,令对方进行GPIO中断已达到通知对方收数据的目的

    GPIOA_ModeCfg(GPIO_Pin_1,GPIO_ModeIN_PU);//配置PA1上拉输入,使能下降沿中断
    GPIOA_ITModeCfg(GPIO_Pin_1, GPIO_ITMode_FallEdge);
    PFIC_EnableIRQ(GPIO_A_IRQn);

    /* SPI 0 */
    GPIOA_SetBits(GPIO_Pin_12);
    GPIOA_ModeCfg(GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14, GPIO_ModeOut_PP_5mA);
    SPI0_MasterDefInit();//初始化SPI引脚配置,主机模式下PA15默认不需要配置

    GPIOA_ResetBits(GPIO_Pin_12);//主机拉低片选线,由于只跟一个设备通讯,这边就一直选中该设备,不再拉高片选线
    while(1)
    {
        DelayMs(1000);//每秒发一次数据给对方
        GPIOA_ResetBits(GPIO_Pin_0);//拉中断线告知对方准备收数据
        SPI0_MasterDMATrans(spiBuff, 12);
        PRINT("send end\n");
        GPIOA_SetBits(GPIO_Pin_0);//发送完数据立即拉高PA0
    }
}

__INTERRUPT
__HIGH_CODE
void GPIOA_IRQHandler(void)//对方拉低中断线告知主机准备读数据
{
    if(GPIOA_ReadITFlagBit(GPIO_Pin_1))
    {
        DelayUs(20);//延迟20us,保证数据已经通过spi线传到主机这边
        SPI0_MasterDMARecv(spiBuffrev, 12);//主机接收从机数据
        for(uint8_t i = 0; i < 12; i++)
        {
            PRINT(" %x", spiBuffrev[i]);
        }
        PRINT("\n");

        GPIOA_ClearITFlagBit(GPIO_Pin_1);
    }
}
主机程序

 

 

2、从机程序(与主机配置收发逻辑一致,只有SPI初始化那边有差异)

void main()
{
    SetSysClock(CLK_SOURCE_PLL_60MHz);
    GPIOA_ModeCfg(GPIO_Pin_1,GPIO_ModeOut_PP_5mA);
    GPIOA_SetBits(GPIO_Pin_1);//默认输出高电平,有数据需要发送时输出低电平通知主机

    GPIOA_ModeCfg(GPIO_Pin_0,GPIO_ModeIN_PU);
    GPIOA_ITModeCfg(GPIO_Pin_0, GPIO_ITMode_FallEdge);
    PFIC_EnableIRQ(GPIO_A_IRQn);//默认上拉,等待下降沿中断收数据

    /* 设备模式 */
    PRINT("1.spi0 mul slave mode \n");
    GPIOA_ModeCfg(GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15, GPIO_ModeIN_PU);
    SPI0_SlaveInit();//SPI引脚初始化及寄存器配置

    while(1)
    {
        DelayMs(1000);
        GPIOA_ResetBits(GPIO_Pin_1);//拉中断线告知对方准备收数据
        SPI0_SlaveDMATrans(spiBuff, 12);
        PRINT("send end\n");
        GPIOA_SetBits(GPIO_Pin_1);
    }
}



__INTERRUPT
__HIGH_CODE
void GPIOA_IRQHandler(void)
{
    if(GPIOA_ReadITFlagBit(GPIO_Pin_0))
    {
        DelayUs(20);
        SPI0_SlaveDMARecv(spiBuffrev, 12);
        for(uint8_t i = 0; i < 12; i++)
        {
            PRINT(" %x", spiBuffrev[i]);
        }
        PRINT("\n");

        GPIOA_ClearITFlagBit(GPIO_Pin_0);
    }
}
从机配置

 

 

3、程序演示效果(左主右从)

 

标签:CH57x,12,Pin,中断,主机,CH59x,SPI,GPIOA,GPIO
From: https://www.cnblogs.com/azou/p/18088820

相关文章

  • yolov5训练数据集意外中断
    痛苦电脑关机,卡死都有可能导致训练中断重新训练不可行所以要改参数,继续训练找到runs-train文件夹下面的文件这时候里面会有exp1,exp2……的文件夹我是训练到10中断(这里可以查看终端训练的代码,会显示正在训练expXXX)所以把大于exp10的exp11删除(如果有其他的也删除)然后找到tra......
  • STM32 HAL库 通过外部中断控制一个灯亮灭
    个人学习理解    在我们学习写代码的过程中,我们配合着开发指南中的程序设计的配置步骤并与我们的学习视频结合着、对比着学习,这能更加让我们对程序设计步骤理解得更加透彻。硬件了解1、LED灯LED0–PB5LED1–PE52、独立按键KEY0–PE4KEY1–PE3KEY2–......
  • STC89C52启动!!!(四)中断
    单片机中断的定义在单片机中,中断是一种机制,用于在特定事件发生时打断当前正在执行的程序流,转而执行预定义的中断服务程序。这种机制可以使单片机在处理实时事件或紧急任务时能够及时响应,提高系统的实时性和可靠性。当单片机设置了中断并且中断条件发生时,单片机会立即停止当......
  • 埃夫特机器人中断程序的使用
    一、创建中断变量与中断子程序创建一个中断变量trap用于关联机器人中断指令创建一个中断子程序,用于触发中断时直接调用编辑中断子程序内容(触发中断后机器人执行的动作)二、添加中断指令进行中断的设置,将中断变量与中断子程序相关联设定中断变量的触发条件允许中断条......
  • 如何不中断连接保持linux服务器持续运行 —— screen 使用介绍
     请参考ck'sblog以获取最佳观感在linux服务器上跑模型的时候,有时会在终端会话中持续了一段时间后超时断开,或者因为意外情况断网,如果正常在命令行终端执行程序时,此时会中断程序的进行,这很恼火,这就意味着要让程序持续运行,就必须得保持主机和服务器的连接,程序跑一晚上,主机就......
  • 使用定时器中断进行延时,可能会遇到的一个小bug
    之前分享过一篇“使用定时器中断进行延时,取代delay”的文章:(https://blog.csdn.net/qq_44139306/article/details/136481381?spm=1001.2014.3001.5501)在后续的使用过程中,发现了一个bug:即:定时器标志不要在刚使用完一次时就清零,可以在下一次赋值计数值前把它清零。特别是......
  • 数字控制系统Simulink仿真建模(1)(仿真步长和中断触发的设置)
    仿真步长的设置 对于数字控制系统而言,在Simulink仿真环境中,总的来说有三个步长需要考虑。首先由于数字控制系统是离散系统,因此需要在仿真模型的模型设置中将求解器类型设置为固定步长,求解器设置为离散,固定步长大小为整个模型的最小执行步长,即在该模型中的模块将默认按照此步......
  • 驱动Driver-中断
    中断简介裸机实验1.使能中断,初始化相应的寄存器。2.注册中断服务函数,也就是向irqTable数组的指定标号处写入中断服务函数3.中断发生以后进入IRQ中断服务函数,在IRQ中断服务函数在数组irqTable里面查找具体的中断处理函数,找到以后执行相应的中断处理函数。中断号......
  • FreeRTOS教程3 中断管理
    1、准备材料正点原子stm32f407探索者开发板V2.4STM32CubeMX软件(Version6.10.0)KeilµVision5IDE(MDK-Arm)野火DAP仿真器XCOMV2.6串口助手2、学习目标本文主要学习FreeRTOS中断管理的相关知识,包括系统硬件中断、FreeRTOS可管理的中断、中断屏蔽和一些其他注意事项等知......
  • linux系统中查看硬件和软件中断
    在Linux系统中,硬件中断可以通过以下几个途径查看:1.查看硬件中断统计信息:通过查看/proc/interrupts文件可以获取硬件中断的统计信息。这个文件会列出系统中每个中断线上的中断次数,以及哪个设备(如果已知)正在使用这条中断线。cat/proc/interrupts运行这个命令后,你会看到......