ccx2xz 发表于 2021-4-18 21:55

GD32F20x中SPI1库函数IO映射问题

请教:在用SPI1映射到PI0/PI1/PI2/PI3遇到了问题:

根据手册, 只要将AFIO_PCF5中的和设置为即可:根据我的理解:
GPIO_PCF5_SPI1_IO_REMAP0 应该是中的第11位
GPIO_PCF5_SPI1_IO_REMAP1 应该是中的第12位
gpio_pin_remap1_config(GPIO_PCF5,GPIO_PCF5_SPI1_IO_REMAP0,DISABLE);

gpio_pin_remap1_config(GPIO_PCF5,GPIO_PCF5_SPI1_IO_REMAP1,ENABLE);
gpio_pin_remap1_config(GPIO_PCF5,GPIO_PCF5_SPI1_NSCK_REMAP0,DISABLE);
gpio_pin_remap1_config(GPIO_PCF5,GPIO_PCF5_SPI1_NSCK_REMAP1,ENABLE);


可是总会设置成???


然后进gd32f20x_gpio.c查看:
if(DISABLE != newvalue){
      /* AFIO port configuration register selection */
      ......
      }else if(GPIO_PCF5 == remap_reg){
            reg = AFIO_PCF5;
            reg |= remap;
            AFIO_PCF5 = reg;
      }
    }else{
       ......
      }else if(GPIO_PCF5 == remap_reg){
            reg = AFIO_PCF5;
            reg &= ~remap;
            AFIO_PCF5 = reg;
      }
    }

没有发现问题。


再查看gd32f20x_gpio.h:
#define GPIO_PCF5_SPI1_NSCK_REMAP0       ((uint32_t)0x00000400U)   /*!< SPI1 NSS/SCK remapping 0 */
#define GPIO_PCF5_SPI1_NSCK_REMAP1       ((uint32_t)0x00000600U)   /*!< SPI1 NSS/SCK remapping 1 */
#define GPIO_PCF5_SPI1_IO_REMAP0         ((uint32_t)0x00000800U)   /*!< SPI1 MISO/MOSI remapping 0 */
#define GPIO_PCF5_SPI1_IO_REMAP1         ((uint32_t)0x00001800U)   /*!< SPI1 MISO/MOSI remapping 1 */



找到了问题:
0x00000800U =>0000 0000 0000 0000 0000 1000 0000 0000
0x00001800U =>0000 0000 0000 0000 0001 1000 0000 0000
后面这个数在二进制中出现两个1,也就是说
gpio_pin_remap1_config(GPIO_PCF5,GPIO_PCF5_SPI1_IO_REMAP1,ENABLE);
会改变两位的值。


我的解决办法,将设置顺序调换一下即可:
gpio_pin_remap1_config(GPIO_PCF5,GPIO_PCF5_SPI1_IO_REMAP1,ENABLE);
gpio_pin_remap1_config(GPIO_PCF5,GPIO_PCF5_SPI1_IO_REMAP0,DISABLE);
......



这个库还在学习过程中,搞得不太懂。
如果是我理解有错,请帮忙指正。
如果是库本身有误,请厂家帮忙改进。


谢谢!{:smile:}









X1aoBa 发表于 2021-4-22 11:26

楼主,请问GPIO_PCF5这个参数是根据GPIO_PCF5_SPI1_IO_REMAP1这个参数确定的吗,假如我要复用成GPIO_PCF5_UART3_REMAP,那我前面那个参数是不死要设置为GPIO_PCF5,但是我看官方数据手册这个参数是设置为GPIO_PCF2,这一块我不太理解。
页: [1]
查看完整版本: GD32F20x中SPI1库函数IO映射问题