MM32F003NW – SPI另类复用(实践失败)

之前已经在踩坑文里面说到,这个芯片的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比较好.

发表评论

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