请教:在用SPI1映射到PI0/PI1/PI2/PI3遇到了问题:
根据手册, 只要将AFIO_PCF5中的[12:11]和[10:9]设置为[10]即可:根据我的理解:
GPIO_PCF5_SPI1_IO_REMAP0 应该是[12:11]中的第11位
GPIO_PCF5_SPI1_IO_REMAP1 应该是[12:11]中的第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);
可是总会设置成[11]???
然后进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);
......
这个库还在学习过程中,搞得不太懂。
如果是我理解有错,请帮忙指正。
如果是库本身有误,请厂家帮忙改进。
谢谢!
|