STM32 HAL 라이브러리는 SPI를 에뮬레이트합니다.

SPI 포트가 충분하지 않기 때문에 아날로그 SPI를 사용하고 프로그램이 비교적 간단합니다 .SPI 모드 0을 사용합니다. 프로세스 중 포트는 통신 할 수 없습니다. 로직 애널라이저를 사용한 후 클럭 라인이 시계가 잘못되었습니다. 이제 문제 없습니다.

 

#define SSD1306_SOFT_SPI_MOSI_PORT 		OLED_DATA_GPIO_Port
#define SSD1306_SOFT_SPI_MOSI_PIN 		OLED_DATA_Pin

#define SSD1306_SOFT_SPI_MISO_PORT 		OLED_DATA_GPIO_Port
#define SSD1306_SOFT_SPI_MISO_PIN 		OLED_DATA_Pin

#define SSD1306_SOFT_SPI_CLK_PORT 		OLED_CLK_GPIO_Port
#define SSD1306_SOFT_SPI_CLK_PIN 			OLED_CLK_Pin

#define SSD1306_CLK_RESET 						HAL_GPIO_WritePin(SSD1306_SOFT_SPI_CLK_PORT, SSD1306_SOFT_SPI_CLK_PIN, GPIO_PIN_RESET)
#define SSD1306_CLK_SET 							HAL_GPIO_WritePin(SSD1306_SOFT_SPI_CLK_PORT, SSD1306_SOFT_SPI_CLK_PIN, GPIO_PIN_SET)

#define SSD1306_MOSI_RESET 						HAL_GPIO_WritePin(SSD1306_SOFT_SPI_MOSI_PORT, SSD1306_SOFT_SPI_MOSI_PIN, GPIO_PIN_RESET)
#define SSD1306_MOSI_SET 							HAL_GPIO_WritePin(SSD1306_SOFT_SPI_MOSI_PORT, SSD1306_SOFT_SPI_MOSI_PIN, GPIO_PIN_SET)

#define SSD1306_MOSI_IN 							HAL_GPIO_ReadPin(SSD1306_SOFT_SPI_MISO_PORT, SSD1306_SOFT_SPI_MISO_PIN)


uint8_t software_spi_wr(uint8_t data){
	//模式0
	uint8_t i, temp = 0;
	//CLK = 0
	SSD1306_CLK_RESET;
	for(i=0;i<8;i++){
		SSD1306_CLK_RESET;
		if(data&0x80) SSD1306_MOSI_SET;
		else SSD1306_MOSI_RESET;
		data<<=1;
		SSD1306_CLK_SET;
		
		//如果不用读的功能,添加这句话,进行几个时钟周期的延时
		SSD1306_CLK_SET;
		
		//如果要读,取下下面注释,并注释上面的延时
		//temp <<=1;
		//temp += SSD1306_MOSI_IN;
	}
	SSD1306_CLK_RESET;
	return temp;
}

출처 : https://blog.csdn.net/shaynerain

추천

출처blog.csdn.net/shaynerain/article/details/108051436