打印

SPI接收不到数据,请各位帮忙

[复制链接]
599|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
spi, IO, GPIO, gp, ni
我的项目要从上位机接收水位数据再进行处理,现在项目进度卡在了数据接收上,上位机是用51芯片,通过串口助手已经可以收到51单片机发送的数据,另外还通过SPI发送数据,用逻辑分析仪观看到正确的时序图(参见下图)。上位机发送的是9个字节的数据,包含两个各三位数的ASCII字符。
  

    我首先调试串口,串口助手可以收到GD32发出的信息,但GD32一直接收不到串口助手发出的信息,由于我刚学32位单片机,从厂家提供的范例中看不出是如何接收数据的。
    随后我又准备通过SPI1来接收,按照范例及参照其他坛友的帖子,反复调试也是无法接收到数据。
    最后我直接设置引脚、写代码来接收SPI数据,调试了几天仍无结果。请各位帮忙看看我的代码是什么问题,若能提供串口接收和SPI1接口的范例也感谢不尽。

GPIO配置代码:
void gpio_config(void)        //GPIO配置SP0(GPIOA),SPI1(GPIOB)和SOFT_SPI(GPIOC)
{
    /* SPI0 GPIO config: SCK/PA5, MISO/PA6, MOSI/PA7 */
    rcu_periph_clock_enable(RCU_GPIOA);
    rcu_periph_clock_enable(RCU_SPI0);
    gpio_af_set(GPIOA, GPIO_AF_0, GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7);
    gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7);
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7);

    /* SPI1 GPIO config: SCK/PB13, MISO/PB14, MOSI/PB15 */
    rcu_periph_clock_enable(RCU_GPIOB);
    rcu_periph_clock_enable(RCU_SPI1);
    gpio_af_set(GPIOB, GPIO_AF_0, GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 |GPIO_PIN_15);
    gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 |GPIO_PIN_15);
    gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 |GPIO_PIN_15);

    //配置soft spi:SL_CS/PC13, SL_MISO/PC12, SL_MOSI/PC11, SL_CLK/PC10
    rcu_periph_clock_enable(RCU_GPIOC);
    gpio_mode_set(GPIOC, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_10 |GPIO_PIN_11 | GPIO_PIN_13 );
    gpio_mode_set(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_12);
    gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_12 );
}



SPI配置程序:
void spi_config(void)
{
    spi_parameter_struct spi_init_struct;
   
    /* SPI0 parameter config */
    spi_init_struct.trans_mode           = SPI_TRANSMODE_FULLDUPLEX; //全双工
    spi_init_struct.device_mode          = SPI_MASTER;               //主设备
    spi_init_struct.frame_size           = SPI_FRAMESIZE_8BIT;       //帧大小为8位
    spi_init_struct.clock_polarity_phase = SPI_CK_PL_HIGH_PH_2EDGE;
    spi_init_struct.nss                  = SPI_NSS_SOFT;
    spi_init_struct.prescale             = SPI_PSC_8;
    spi_init_struct.endian               = SPI_ENDIAN_MSB;
    spi_init(SPI0, &spi_init_struct);

    /* SPI1 parameter config */
    spi_init_struct.trans_mode  = SPI_TRANSMODE_BDRECEIVE;
    spi_init_struct.device_mode = SPI_SLAVE;
    spi_init_struct.nss         = SPI_NSS_SOFT;
    spi_init(SPI1, &spi_init_struct);
}



软件读入SPI:
uint8_t soft_spi_read(void)     //软件编程读SPI1
{
    uint8_t i,j, dat;
    while (gpio_input_bit_get(GPIOC,GPIO_PIN_13) == SET)   //高电平时循环等待片选信号
    {
        if (gpio_input_bit_get(GPIOC,GPIO_PIN_13) == RESET) //低电平时开始接收数据
        {
            for (j=0; j<9; j++)           //接收9个字节数据
            {
                for (i=0; i<8; i++)       //读入8位(1个字节)
                {
                    while(gpio_input_bit_get(GPIOC,GPIO_PIN_10) == RESET);//PC10引脚CLK低电平时循环
                    if (gpio_input_bit_get(GPIOC,GPIO_PIN_11) == SET)         //PC11引脚MOSI
                    {
                        dat = dat + 1;
                    }
                    dat <<= 1;
                    while(gpio_input_bit_get(GPIOB,GPIO_PIN_10) == SET);  //PC10引脚CLK高电平时循环
                }                         //1字节读取完成
                receiver_buffer[j] = dat;
            }                             //块(9字节)读取完成
            return RESET;            //接收完毕,返回正确标志
        }
    }
    return SET;
}


main函数中调用:
    if (soft_spi_read() == RESET) //调取SPI读数据模块
    {
        display_abnormal();       //读到数据
    }
    else
    {
        display_wait();           //未读到数据
    }

使用特权

评论回复
沙发
caigang13| | 2020-11-13 07:11 | 只看该作者
不应该啊,是不是串口线有问题?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2034

主题

7330

帖子

10

粉丝