目标:
实现spi的Master端。
参考资料:
http://bbs.elecfans.com/jishu_441914_1_1.html
这篇文章讲的非常直观易懂,看完就明白了。
1、首先配置口线,串口用来输入和打印,四个io口用来模拟spi,原本准备在一个单片机上同时模拟主从,但貌似不太可行,这种模拟的方式都是阻塞的。
2、proteus连接口线,放spi调试器和示波器,本来准备放个逻辑分析仪,但既然有spi调试器,用起来更方便,就没弄逻辑分析仪。
3、打开cubemx生成的工程,首先修改 main.h,加入口线的控制函数:
/* Private defines -----------------------------------------------------------*/
#define MASTER_CLK_Pin GPIO_PIN_1
#define MASTER_CLK_GPIO_Port GPIOC
#define MOSI_Pin GPIO_PIN_2
#define MOSI_GPIO_Port GPIOC
#define MISO_Pin GPIO_PIN_3
#define MISO_GPIO_Port GPIOC
#define CS_Pin GPIO_PIN_4
#define CS_GPIO_Port GPIOC
/* USER CODE BEGIN Private defines */
#define SCLK_SET_H HAL_GPIO_WritePin(MASTER_CLK_GPIO_Port, MASTER_CLK_Pin, GPIO_PIN_SET)
#define SCLK_SET_L HAL_GPIO_WritePin(MASTER_CLK_GPIO_Port, MASTER_CLK_Pin, GPIO_PIN_RESET)
#define MOSI_SET_H HAL_GPIO_WritePin(MOSI_GPIO_Port, MOSI_Pin, GPIO_PIN_SET)
#define MOSI_SET_L HAL_GPIO_WritePin(MOSI_GPIO_Port, MOSI_Pin, GPIO_PIN_RESET)
#define MISO_READ HAL_GPIO_ReadPin(MISO_GPIO_Port, MISO_Pin)
#define CS_H HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET)
#define CS_L HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET)
uint8_t SPI_RW_BYTE_MODE0(uint8_t data);
uint8_t SPI_RW_BYTE_MODE1(uint8_t data);
uint8_t SPI_RW_BYTE_MODE2(uint8_t data);
ui