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;
}

from:https://blog.csdn.net/shaynerain

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用HAL库进行SPI接收的函数为HAL_SPI_Receive(),该函数的定义如下: ```c HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout); ``` 该函数的参数说明如下: - `hspi`:SPI句柄,指向SPI_HandleTypeDef类型的结构体。 - `pData`:接收数据的缓冲区指针。 - `Size`:接收数据的数量。 - `Timeout`:超时时间,单位为毫秒。 函数返回值为HAL_StatusTypeDef类型,表示函数的执行状态。 使用该函数进行SPI接收的步骤如下: 1. 配置SPI从机设备的相关参数,包括SPI模式、数据位宽、CPOL、CPHA等。 2. 使能SPI从机设备,并启动SPI传输。 3. 调用HAL_SPI_Receive()函数进行数据接收。 4. 等待数据接收完成。 5. 关闭SPI传输。 下面是一个使用HAL库进行SPI接收的例子: ```c #include "stm32f4xx_hal.h" #define SPI_CS_GPIO_PORT GPIOA #define SPI_CS_PIN GPIO_PIN_4 #define RX_BUFFER_SIZE 10 SPI_HandleTypeDef hspi1; uint8_t rx_buffer[RX_BUFFER_SIZE]; void SPI_Init(void) { hspi1.Instance = SPI1; hspi1.Init.Mode = SPI_MODE_MASTER; hspi1.Init.Direction = SPI_DIRECTION_2LINES; hspi1.Init.DataSize = SPI_DATASIZE_8BIT; hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; hspi1.Init.NSS = SPI_NSS_SOFT; hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256; hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi1.Init.TIMode = SPI_TIMODE_DISABLE; hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; hspi1.Init.CRCPolynomial = 7; HAL_SPI_Init(&hspi1); } void SPI_CS_Select(void) { HAL_GPIO_WritePin(SPI_CS_GPIO_PORT, SPI_CS_PIN, GPIO_PIN_RESET); } void SPI_CS_Deselect(void) { HAL_GPIO_WritePin(SPI_CS_GPIO_PORT, SPI_CS_PIN, GPIO_PIN_SET); } int main(void) { HAL_Init(); SPI_Init(); while (1) { SPI_CS_Select(); HAL_SPI_Receive(&hspi1, rx_buffer, RX_BUFFER_SIZE, 100); SPI_CS_Deselect(); } } ``` 在上面的例子中,我们使用了SPI1作为主设备,并且使用了软件模拟NSS信号。在主循环中,我们不断地向从机设备发送读取命令,并使用HAL_SPI_Receive()函数读取从机设备返回的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值