void vSetSSN(int value)
{
// GPIO_CS
// gpio_set_direction(GPIO_CS, GPIO_MODE_INPUT); //写这个或下一个
// 1为高电平,0为低电平
// gpio_set_level(GPIO_CS, value);
gpio_reset_pin(GPIO_CS);
gpio_set_direction(GPIO_CS, GPIO_MODE_INPUT);
gpio_set_level(GPIO_CS, value);
}
void vSetMISO(int value)
{
// gpio_set_direction(GPIO_MISO, GPIO_MODE_OUTPUT); //写这个或下一个
// 1为高电平,0为低电平
// gpio_set_level(GPIO_MISO, value);
gpio_reset_pin(GPIO_MISO);
gpio_set_direction(GPIO_MISO, GPIO_MODE_OUTPUT);
gpio_set_level(GPIO_MISO, value);
}
void vSetMOSI(int value)
{
//gpio_set_direction(GPIO_MOSI, GPIO_MODE_INPUT); //写这个或下一个
// 1为高电平,0为低电平
//gpio_set_level(GPIO_MOSI, value);
gpio_reset_pin(GPIO_MOSI);
gpio_set_direction(GPIO_MOSI, GPIO_MODE_INPUT);
gpio_set_level(GPIO_MOSI, value);
}
void vSetSCK(int value)
{
//gpio_set_direction(GPIO_SCLK, GPIO_MODE_INPUT); //写这个或下一个
// 1为高电平,0为低电平
//gpio_set_level(GPIO_SCLK, value);
gpio_reset_pin(GPIO_SCLK);
gpio_set_direction(GPIO_SCLK, GPIO_MODE_INPUT);
gpio_set_level(GPIO_SCLK, value);
}
static spi_device_handle_t spi_init(spi_host_device_t host_id, gpio_num_t miso_io_num, gpio_num_t mosi_io_num, gpio_num_t sclk_io_num, gpio_num_t cs_io_num, int clock_speed_mhz){
spi_bus_config_t buscfg = {
.miso_io_num = miso_io_num,
.mosi_io_num = mosi_io_num,
.sclk_io_num = sclk_io_num,
.quadwp_io_num = GPIO_NUM_NC,
.quadhd_io_num = GPIO_NUM_NC,
};
ESP_ERROR_CHECK(spi_bus_initialize(host_id, &buscfg, SPI_DMA_DISABLED));
spi_device_interface_config_t devcfg = {
.mode = 3,
.clock_speed_hz = clock_speed_mhz * 1000 * 1000,
.spics_io_num = cs_io_num,
.cs_ena_posttrans = 0,
};
spi_device_handle_t spi_handle = NULL;
ESP_ERROR_CHECK(spi_bus_add_device(host_id, &devcfg, &spi_handle));
return spi_handle;
}
/**/
static esp_err_t spi_write(spi_device_handle_t spi, uint8_t *data, int len){
esp_err_t err;
err = spi_device_acquire_bus(spi, portMAX_DELAY);
if (err != ESP_OK) return err;
spi_transaction_t t = {
.length = len*8,
.flags = SPI_TRANS_USE_TXDATA,
.tx_buffer = data,
};
err = spi_device_polling_transmit(spi, &t);
spi_device_release_bus(spi);
return err;
}
/**/
static esp_err_t spi_read(spi_device_handle_t spi, uint8_t *data, int len){
spi_transaction_t t = {
.length = len*8,
.flags = SPI_TRANS_USE_RXDATA,
.rx_buffer = data,
};
return spi_device_polling_transmit(spi, &t);
}
/**/
static esp_err_t spi_write_read(spi_device_handle_t spi, uint8_t *w_data, uint8_t *r_data, int len){
esp_err_t err;
err = spi_write(spi, w_data, len);
if (err!= ESP_OK) return err;
err = spi_read(spi, r_data, len);
return err;
}
#define ESP_SPI_FREQ 1
#define ESP_SPI_HOST SPI3_HOST
#define PIN_NUM_MISO 37
#define PIN_NUM_MOSI 35
#define PIN_NUM_CLK 36
#define PIN_NUM_CS 34
// Main application
void app_main(void)
{
uint8_t cmd[10] = {0x55, 0x00, 0xB0, 0x99, 0x00, 0x00, 0x02, 0x00, 0x08, 0x00};
cmd[9] = getLRCx(&cmd[1], 8);
uint8_t tx_str[10];
memcpy(tx_str, cmd, 10);
spi_device_handle_t spi_hdl;
spi_hdl = spi_init(ESP_SPI_HOST, PIN_NUM_MISO, PIN_NUM_MOSI, PIN_NUM_CLK, PIN_NUM_CS, ESP_SPI_FREQ);
vSetSSN(0);
vTaskDelay(pdMS_TO_TICKS(100));
esp_err_t err;
err = spi_write(spi_hdl, tx_str, 10);
vTaskDelay(pdMS_TO_TICKS(5));
// vTaskDelay(100);
vSetSSN(1);
vTaskDelay(pdMS_TO_TICKS(10));
vSetSSN(0);
vTaskDelay(pdMS_TO_TICKS(100));
uint8_t rx_buffer[10];
err = spi_read(spi_hdl, rx_buffer, 10);
ESP_LOGI(TAG, "W25Q64_readStatusReg2=%x", rx_buffer[0]);
// Never reached.
err = spi_bus_remove_device(spi_hdl);
}