关于GD32做SPI从机收数响应实验

前言

网上例程多为GD32(STM32)做主机的案例代码,个人试验总结出一套可用的MCU做SPI从机的案例

实现功能:

GD32通过配置为SPI  从机00工作模式,接收上位机(调试软件)下发的一帧数据,进入SPI中断后,通过USART0原样返回数据。

直接上干货

代码部分:

主函数:

#include <stdio.h>  
#include "systick.h"
#include "usart_comm.h"
#include "gd_slave_spi.h"
//程序功能,实现单片机与电脑之间的通信,通过电脑(SPI主机)
//下发数据,然后,单片机通过USART原样返回数据
//用SPI调试工具发送数据,要配置成模式00,msb,主模式

extern uint8_t spi0_receive_array[10];//SPI接收数据的下脚游标
extern uint8_t i;//定义全局变量i

int main (void)
{


    systick_config();  //
    gd32_slave_spi_init();
    usart0_init(9600);
    uint8_t t = 0;

    while (1)
    {
        //uint8_t read_buffer[10];
        while (i) //等待i状态反转,一旦反转说明SPI0接收到了数据
        {
            i = 0;
            usart_interrupt_disable(USART0, USART_INT_RBNE);

            for (t = 0; t < sizeof(spi0_receive_array); t++)
            {
                usart0_send_byte(spi0_receive_array[t]);
            }

            usart_interrupt_enable(USART0, USART_INT_RBNE);
        }
    }
}

.C函数

#include "gd_slave_spi.h"

uint8_t spi0_receive_array[10] = {0};
uint8_t receive_n = 0;//SPI接收数据的下脚游标

uint8_t i = 0;//反应SPI状态的变量


void gd32_slave_spi_init(void)
{
    //使能外设时钟
		spi_slave_rcu_init();
    //首先对IO口进行配置,使之被复用为SPI,这里使用的是SPI0,对应PA4,PA5,PA6,PA7,NSS,SCK,MISO,MOSI
    spi_slave_io_init();
    //SPI0初始化
    spi_slave_config();
}

void spi_slave_rcu_init(void)
{
    rcu_periph_clock_enable(RCU_GPIOA);//使能GPIO0时钟
  //  rcu_periph_clock_enable(RCU_AF);//
    rcu_periph_clock_enable(RCU_SPI0);//使能SPI0时钟
}

//SPI从机初始化
void  spi_slave_io_init(void)
{
    gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6); //PA6为MISO
    gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_5 | GPIO_PIN_7); //PA7为MOSI
    gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_4); //NSS片选口,
}

//SPI0初始化


void spi_slave_config(void)
{
    spi_parameter_struct spi_struct;//定义结构体
    spi_struct.device_mode = SPI_SLAVE;    /*!< SPI master or slave */
    spi_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX;       /*!< SPI transfer type */
    spi_struct.frame_size = SPI_FRAMESIZE_8BIT ;       /*!< SPI frame size */
    spi_struct.nss = SPI_NSS_HARD;     /*!< SPI NSS control by handware or software */
    spi_struct.endian = SPI_ENDIAN_MSB;     /*!< SPI big endian or little endian */
    spi_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE;    /*模式0工作*/
    spi_struct.prescale = SPI_PSC_8;   /*!< SPI prescaler factor 预分频器配置*/
    spi_init(SPI0, &spi_struct);
	
		nvic_irq_enable(SPI0_IRQn,1,0);//设置中断优先级
			/* SPI int enable */
    //spi_i2s_interrupt_enable(SPI1, SPI_I2S_INT_TBE);
    spi_i2s_interrupt_enable(SPI0, SPI_I2S_INT_RBNE);  //接收缓冲区非空中断使能
		spi_enable(SPI0);//使能SPI0
	
	
}



void SPI0_IRQHandler(void)
{
		
		/* receive data */

    if(RESET != spi_i2s_interrupt_flag_get(SPI0,SPI_I2S_INT_FLAG_RBNE)) 
    {
        spi0_receive_array[receive_n++] = spi_i2s_data_receive(SPI0);  //SPI0接收到的数据赋值给数组

       // while(RESET == spi_i2s_flag_get(SPI1, SPI_FLAG_TBE));
	  //  spi_i2s_data_transmit(SPI1, slave_tx_buf[tx_n++]);
        if (receive_n == 10)
        {  
           // handle_spi1_message(spi1_receive_array,16);
            receive_n = 0;
						i = 1;
        }
    }
}






 调试器配置:

 

 最终,SPI调试软件发送以上10字节数据,串口返回相同的10字节数据。

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: 如果 ROS 主机发送的 topic 消息从机收不到,需要检查以下几点: 1. 确保主机和从机在同一个网络中。 2. 确保主机和从机的 ROS_MASTER_URI 设置正确。 3. 确保主机和从机上的 topic 名称相同。 4. 确保主机和从机上的 topic 类型相同。 5. 确保主机已经发布了该 topic。 6. 确保从机已经订阅了该 topic。 7. 如果仍然无法解决问题,可以尝试在终端上运行 rostopic list 和 rostopic echo 来检查 topic 的发布和订阅状态。 ### 回答2: 如果ROS主机发送topic消息但从机收不到,可以按照以下步骤进行处理: 1. 检查网络连接:首先确保主机和从机之间的网络连接是正常的,如果网络连接出现问题,需要解决网络问题才能正常通信。 2. 检查topic名称和消息类型:确保主机发送的topic名称和消息类型与从机的订阅名称和消息类型一致。如果不一致,从机将无法收到对应的消息。 3. 检查主机和从机的ROS节点是否在同一个ROS网络中:确认主机和从机的ROS节点在同一个ROS网络中,可以使用命令`rosnode info`来检查节点信息。 4. 检查主机和从机的ROS Master URI是否配置正确:确保主机和从机的ROS Master URI已正确配置。可以通过设置环境变量`ROS_MASTER_URI`来设置ROS Master的URI地址。 5. 检查主机和从机是否在同一个ROS主题命名空间中:如果使用了命名空间来组织主题,确保主机和从机都在相同的命名空间中,这样才能正确订阅和发布主题。 6. 检查从机的订阅代码:查看从机的订阅代码,确保订阅的主题名称和消息类型与主机发送的消息一致。同时检查是否正确调用了`rospin`等用于订阅主题的函。 7. 检查主机和从机的时间同步:ROS系统对时间同步要求较高,建议使用ntp服务等方法确保主机和从机的时间同步,以避免因时间不同步导致的通信问题。 8. 检查主机和从机的防火墙设置:有时防火墙设置可能会阻止ROS消息的通信,可以尝试关闭或修改防火墙的设置,确保ROS消息能够正常通过。 如果按照上述步骤进行检查仍未解决问题,可以根据具体情况进一步调试或咨询ROS社区寻求帮助。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

带鱼九号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值