#include #include #include #include #include "main.h" #include "usart.h" #include "tim.h" #define READ_CMD 0x80 #define SPI_TIMEOUT_VALUE 1000 #define SPI_CS_1() HAL_GPIO_WritePin(SEL_GPIO_Port, SEL_Pin, GPIO_PIN_SET) /* */ #define SPI_CS_0() HAL_GPIO_WritePin(SEL_GPIO_Port, SEL_Pin, GPIO_PIN_RESET) /* */ #define SPI_SCK_1() HAL_GPIO_WritePin(CLK_GPIO_Port, CLK_Pin, GPIO_PIN_SET) /* SCK = 1 */ #define SPI_SCK_0() HAL_GPIO_WritePin(CLK_GPIO_Port, CLK_Pin, GPIO_PIN_RESET) /* SCK = 0 */ #define SPI_MOSI_1() HAL_GPIO_WritePin(MOSI_GPIO_Port, MOSI_Pin, GPIO_PIN_SET) /* MOSI = 1 */ #define SPI_MOSI_0() HAL_GPIO_WritePin(MOSI_GPIO_Port, MOSI_Pin, GPIO_PIN_RESET) /* MOSI = 0 */ #define SPI_READ_MISO() HAL_GPIO_ReadPin(MISO_GPIO_Port, MISO_Pin) /* 读MISO口线状态 */ #define Dummy_Byte 0xFF // 读取时MISO发送的数据,可以为任意数据 #define spi_delay_us 5 #define spi_table_type_size 50 typedef enum { SPI_SEL_TYPE = 0, SPI_SCK_TYPE, SPI_MOSI_TYPE, SPI_MISO_TYPE, SPI_TYPE_NUMBER, } SPI_TYPE; uint8_t table[SPI_TYPE_NUMBER][spi_table_type_size] = { {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1}, // sel {1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, // sck {1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, // mosi {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // miso }; void sys_delay_us(uint32_t us) { uint16_t counter = 0; __HAL_TIM_SET_COUNTER(&htim7, 0); HAL_TIM_Base_Start(&htim7); while (counter < us) { counter = __HAL_TIM_GET_COUNTER(&htim7); } HAL_TIM_Base_Stop(&htim7); } void set_spi_table_sel(uint8_t startoff) { for (size_t i = 0; i < spi_table_type_size; i++) { if (i < startoff) { table[SPI_SEL_TYPE][i] = 1; } else if (i >= startoff && i < (startoff + 35)) { table[SPI_SEL_TYPE][i] = 0; } else { table[SPI_SEL_TYPE][i] = 1; } } } void set_spi_table_sck(uint8_t startoff) { bool clocklevel = false; for (size_t i = 0; i < spi_table_type_size; i++) { if (i < startoff) { table[SPI_SCK_TYPE][i] = 1; } else if (i >= startoff && i < (startoff + 16)) { (clocklevel) ? (table[SPI_SCK_TYPE][i] = 1) : (table[SPI_SCK_TYPE][i] = 0); clocklevel = !clocklevel; } else { table[SPI_SCK_TYPE][i] = 1; } } } void set_spi_table_mosi(uint8_t startoff, uint8_t txdata) { HAL_UART_Transmit(&huart1, &txdata, 1, 100); for (size_t i = 0; i < spi_table_type_size; i += 2) { if (i < startoff) { table[SPI_MOSI_TYPE][i] = 1; table[SPI_MOSI_TYPE][i + 1] = 1; } else if ((i >= startoff) && (i < (startoff + 16))) { table[SPI_MOSI_TYPE][i] = 1; (txdata & 0x80) ? (table[SPI_MOSI_TYPE][i] = 1), (table[SPI_MOSI_TYPE][i + 1] = 1) : (table[SPI_MOSI_TYPE][i] = 0), (table[SPI_MOSI_TYPE][i + 1] = 0); txdata = txdata << 1; } else if ((i >= startoff + 16) && (i < (startoff + 32))) { table[SPI_MOSI_TYPE][i] = 1; table[SPI_MOSI_TYPE][i + 1] = 1; } else { table[SPI_MOSI_TYPE][i] = 1; table[SPI_MOSI_TYPE][i + 1] = 1; } } } void dotable(uint8_t txdata) { int sel_startoff = 2; int clock_startoff = 4; int mosi_startoff = 4; set_spi_table_sel(sel_startoff); // set_spi_table_sck(clock_startoff); // set_spi_table_mosi(mosi_startoff, txdata); for (size_t i = 0; i < spi_table_type_size; i++) { table[SPI_SEL_TYPE][i] ? SPI_CS_1() : SPI_CS_0(); table[SPI_SCK_TYPE][i] ? SPI_SCK_1() : SPI_SCK_0(); table[SPI_MOSI_TYPE][i] ? SPI_MOSI_1() : SPI_MOSI_0(); sys_delay_us(spi_delay_us); } } void user_main() { // uint8_t temp; SPI_CS_1(); // 片选 SPI_SCK_1(); // 时钟空闲高电平 SPI_MOSI_1(); // 数据线空闲高电平 while (1) { dotable(0x86); // HAL_UART_Transmit(&huart1, &temp, 1, 100); HAL_Delay(10); } }