#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
//
#include "driver/spi_master.h"
#include "driver/spi_common.h"
#include "driver/gpio.h"
//
#include "esp_system.h"
#include "esp_event.h"
#include "nvs_flash.h"
#include "soc/rtc_periph.h"
#include "esp_timer.h"
#include "rom/ets_sys.h"
#include "esp_log.h"
#include "sdkconfig.h"
#include "esp_spi_flash.h"
//
#include <inttypes.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/semphr.h"
#include "freertos/queue.h"
#include "esp_intr_alloc.h"
#define MOSI GPIO_NUM_23
#define MISO GPIO_NUM_19
#define CS GPIO_NUM_4
#define DRDY GPIO_NUM_2
#define SCLK GPIO_NUM_18
#define RST GPIO_NUM_27
//
#define SCLOCK 500000 // 4MHz
//
#define WAKEUP 0x02
#define STANDBY 0x04
#define RESET 0x06
#define START 0x08
#define STOP 0x0A
#define RDATAC 0x10
#define SDATAC 0x11
#define RDATA 0x12
// register address
#define RREG 0x20 // RREG | rrrrr với r.rrrr là địa chỉ thanh ghi bắt đầu
#define WREG 0x40 // WREG | rrrrr với r.rrrr là địa chỉ thanh ghi bắt đầu
//
#define IDADS 0x0
#define CONFIG1 0x01
#define CONFIG2 0x02
#define CONFIG3 0x03
#define LOFF 0x04
// CHANNEL ST
#define CH1SET 0x05
#define CH2SET 0x06
#define CH3SET 0x07
#define CH4SET 0x08
#define CH5SET 0x09
#define CH6SET 0x0A
#define CH7SET 0x0B
#define CH8SET 0x0C
#define RLD_SENSP 0x0D
#define RLD_SENSN 0x0E
#define LOFF_SENSP 0x0F
#define LOFF_SENSN 0x10
#define LOFF_FLIP 0x11
// lead-off stt register (read-only)
#define LOFF_STATP 0x12
#define LOFF_STATN 0x13
// GPIO AND OTHER REGISTER
#define GPIO 0x14
#define PACE 0x15
#define RESP 0x16
#define CONFIG4 0x17
#define WCT1 0x18
#define WCT2 0x19
int i = 0;
spi_device_handle_t handle;
uint8_t SPI_transfer2()
{
char *sendbuf = heap_caps_malloc((7) & (~3), (1 << 3));
memset(sendbuf, 0, ((7) & (~3), (1 << 3)));
gpio_set_level(CS, 0);
sendbuf[0] = 0x11;
spi_transaction_t t;
esp_err_t err;
memset(&t, 0, sizeof(t));
t.length = 8;
t.flags = 0,
t.tx_buffer = sendbuf;
spi_device_transmit(handle, &t);
gpio_set_level(CS, 1);
return t.rx_buffer;
}
uint8_t SPI_transfer(uint8_t data)
{
spi_transaction_t t;
esp_err_t err;
memset(&t, 0, sizeof(t));
t.length = 16;
t.rxlength = 16;
gpio_set_level(MOSI,1);
t.flags = SPI_TRANS_USE_TXDATA | SPI_TRANS_USE_RXDATA;
t.tx_data[0] = data;
t.tx_data[1] = 0;
t.rx_data[0] = data;
err = spi_device_polling_transmit(handle, &t);
return t.rx_data[0];
}
void app_main() {
gpio_set_level(GPIO_NUM_2, 1);
gpio_set_direction(2, GPIO_MODE_OUTPUT);
spi_bus_config_t busconfig = {
.flags = SPICOMMON_BUSFLAG_MASTER,
.sclk_io_num = SCLK,
.mosi_io_num = MOSI,
.miso_io_num = MISO,
.quadhd_io_num = -1,
.quadwp_io_num = -1,
};
spi_device_interface_config_t devcfg = {
.flags = 0,
.mode = 1,
.clock_speed_hz = SCLOCK,
.duty_cycle_pos = 128, // 50% duty cycle
.queue_size = 2,
.cs_ena_posttrans = 2,
};
spi_bus_initialize(VSPI_HOST, &busconfig, 0);
spi_bus_add_device(VSPI_HOST, &devcfg, &handle);
vTaskDelay(100 / portTICK_PERIOD_MS);
uint8_t ID = 0x00;
vTaskDelay(1000 / portTICK_PERIOD_MS);
// gpio_set_level(GPIO_NUM_2, 0);
// ID = SPI_transfer(0x00);
// SPI_transfer(SDATAC);
// gpio_set_level(GPIO_NUM_2, 1);
// vTaskDelay(10 / portTICK_PERIOD_MS);
// gpio_set_level(GPIO_NUM_2, 0);
// SPI_transfer(0x20); // 45us // 1us
// SPI_transfer(0x00);
// ID = SPI_transfer(0x00);
// gpio_set_level(GPIO_NUM_2, 1);
// SPI_write_Byte(handle,1);
SPI_transfer2();
while (1)
{
printf("id : %d \n", ID);
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}