MM32F003NW – GPIO配置踩坑

这不是一篇入门文,这是踩坑记录.

看看手册上的配置描述,看起来清晰简单.

然后开始我拙劣的表演.


uint8_t SoftSPI_SendByte(uint8_t data)
{
	uint8_t i = 0;
	uint8_t temp = 0x00;

	for(i=8;i>0;i--){
		if(data&0x80){
			GPIOB->BSRR = 0x2000;
		}else{
			GPIOB->BRR = 0x2000;
		}
		
		data<<=1;
		GPIOB->BSRR = 0x4000;
		temp<<=1;

		if(GPIOA->IDR & 0x40){
			temp++;
		}
		GPIOB->BRR = 0x4000;
	}

	return temp;
}

当我SPI不接BMP280模块的SDO引脚时,输出如下(也就是证明BMP280是正常的,实际上使用硬件SPI可以通信.):

当我选上最期望的方法,浮空输入,发现是会干扰输出.

后来我实践了所有组合,发现只有一个方法可以正确,而且,不能接上拉电阻,但是以为这就成功了吗?不i是,虽然软件模拟SPI很慢,但是这个速度依然不能正常通信,原因为止,所以我插入了延迟.


static void delay(uint8_t uldelay)
{
    uint8_t i;
    i = uldelay; while(i--);
}
uint8_t SoftSPI_SendByte(uint8_t data)
{
	uint8_t i = 0;
	uint8_t temp = 0x00;

	for(i=8;i>0;i--){
		if(data&0x80){
			GPIOB->BSRR = 0x2000;
		}else{
			GPIOB->BRR = 0x2000;
		}
		delay(5);
		
		data<<=1;
		GPIOB->BSRR = 0x4000;
		temp<<=1;
		delay(5);

		if(GPIOA->IDR & 0x40){
			temp++;
		}
		GPIOB->BRR = 0x4000;
		delay(5);
	}

	return temp;
}

现在终于解决IO读取不正确问题了,手册上的描述竟然是错误的或者说芯片设计问题?

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注