这不是一篇入门文,这是踩坑记录.
看看手册上的配置描述,看起来清晰简单.
然后开始我拙劣的表演.
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读取不正确问题了,手册上的描述竟然是错误的或者说芯片设计问题?