之前已经在踩坑文里面说到,这个芯片的SPI是存在复用问题的,于是我做了个实验,进行以下IO分配.
PA0 => CS
PB13 => SCLK
PB14 => MOSI/MISO
要注意了,这里MOSI和MISO连在一起,也就是说,同一时刻,只能有一个在工作,全双工的SPI通信就一定不能符合,注意到他们有不同的复用和IO状态,其他代码不啰嗦,看这个.
uint8_t BMP280_LL_TransmitData8(uint8_t tx_data)
{
GPIOB->AFRH &= ~0x0F000000;
GPIOB->AFRH |= 0x01000000;
GPIOB->CRH &= ~0x0F000000;
GPIOB->CRH |= 0x0B000000;
SPI2->EXTCTL = 8;
SPI2->TXREG = tx_data;
while (!(SPI2->CSTAT & 0x0003))
{
}
return SPI2->RXREG;
}
uint8_t BMP280_LL_ReceiveData8(void)
{
GPIOB->AFRH &= ~0x0F000000;
GPIOB->AFRH |= 0x00000000;
GPIOB->CRH &= ~0x0F000000;
GPIOB->CRH |= 0x04000000;
SPI2->EXTCTL = 8;
SPI2->TXREG = 0x00;
while (!(SPI2->CSTAT & 0x0003))
{
}
return SPI2->RXREG;
}
但是理想是理想,现实是很残酷的,首先,发送任何数据都发不出去,因为一旦带着时钟,MISO就会得到从机输出的数据,这是短路不可容忍.当自己准备接受数据的时候,都没预先写指令,怎么做接收呢?
OK,第二个方法,这两个IO不会单纯的拧一起,增加三极管,要两个,再增加一个普通IO进行控制,那好吧,我觉得我还是软件模拟SPI比较好.