5

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

 3 years ago
source link: https://www.taterli.com/7637/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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比较好.


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK