/** * @file HW_SPI_ATY.c * * @param Project DEVICE_GENERAL_ATY_LIB * * @author ATY * * @copyright * - Copyright 2017 - 2023 MZ-ATY * - This code follows: * - MZ-ATY Various Contents Joint Statement - * * https://mengze.top/MZ-ATY_VCJS * - CC 4.0 BY-NC-SA - * * https://creativecommons.org/licenses/by-nc-sa/4.0/ * - Your use will be deemed to have accepted the terms of this statement. * * @brief Familiar functions of SPI for all embedded device * * @version * - 1_01_221028 > ATY * -# Preliminary version, first Release * -Undone: in soft ******************************************************************************** */ #ifndef __HW_SPI_ATY_C #define __HW_SPI_ATY_C #include "HW_SPI_ATY.h" /******************************* For user *************************************/ /******************************************************************************/ #ifndef __SPI_HARDWARE_ATY #else #if defined(__STC51_ATY) uint8_t SPI_Write(uint8_t* data_t, uint16_t len) { uint8_t i = 0; uint16_t errCount = 1000; SPCTL = 0xD4; for(i = 0; i < len; i++) { SPSTAT |= 0xC0; SPDAT = *(data_t + i); while(((SPSTAT & 0x80) != 0x80) && errCount) errCount--; if(errCount == 0) return 1; } return 0; } uint8_t SPI_Read(uint8_t* data_t, uint16_t len) { uint8_t i = 0; uint16_t errCode = 1000; SPCTL = 0xD4; for(i = 0; i < len; i++) { SPSTAT |= 0xC0; SPDAT = 0xFF; while(((SPSTAT & 0x80) != 0x80) && errCode) errCode--; if(errCode == 0) return 1; *(data_t + i) = SPDAT; } return 0; } #elif defined(__STM32_HAL_ATY) #include "spi.h" uint8_t SPI_Write(uint8_t* data_t, uint16_t len) { uint8_t i = 3; while(i--) { if(HAL_SPI_Transmit(&SPIH_N, data_t, len, 1000) == HAL_OK) return 0; } return 1; } uint8_t SPI_Read(uint8_t* data_t, uint16_t len) { uint8_t i = 3; while(i--) { if(HAL_SPI_Receive(&SPIH_N, data_t, len, 1000) == HAL_OK) return 0; } return 1; } #elif defined(__ESP8266_RTOS_ATY) #include #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/queue.h" #include "esp8266/gpio_struct.h" #include "esp8266/spi_struct.h" #include "esp_system.h" #include "esp_log.h" #include "esp_libc.h" #include "driver/gpio.h" #include "driver/spi.h" static const char *TAG = "user_spi"; esp_err_t esp8266_spi_init(void) { ESP_LOGI(TAG, "init spi"); spi_config_t spi_config; // Load default interface parameters // CS_EN:1, MISO_EN:1, MOSI_EN:1, BYTE_TX_ORDER:1, BYTE_TX_ORDER:1, BIT_RX_ORDER:0, BIT_TX_ORDER:0, CPHA:0, CPOL:0 spi_config.interface.val = SPI_DEFAULT_INTERFACE; // Load default interrupt enable // TRANS_DONE: true, WRITE_STATUS: false, READ_STATUS: false, WRITE_BUFFER: false, READ_BUFFER: false spi_config.intr_enable.val = SPI_MASTER_DEFAULT_INTR_ENABLE; spi_config.interface.cs_en = 0; spi_config.interface.mosi_en = 1; spi_config.interface.miso_en = 1; // Set SPI to master mode // ESP8266 Only support half-duplex spi_config.mode = SPI_MASTER_MODE; // Set the SPI clock frequency division factor spi_config.clk_div = SPI_2MHz_DIV; spi_config.event_cb = NULL; return spi_init(HSPI_HOST, &spi_config); } /** * @brief * @note use [ESP8266_RTOS_SDK](https://github.com/espressif/ESP8266_RTOS_SDK/) */ // esp_err_t SPI_Write(uint8_t* data_t, uint16_t len) uint8_t SPI_Write(uint8_t* data_t, uint16_t len) { spi_trans_t trans = {0}; trans.mosi = data; trans.bits.mosi = len * 8; return spi_trans(HSPI_HOST, &trans); } uint8_t SPI_Read(uint8_t* data_t, uint16_t len) { spi_trans_t trans; memset(&trans, 0x0, sizeof(trans)); trans.bits.val = 0; trans.miso = data_t; trans.bits.miso = len * 8; if(spi_trans(HSPI_HOST, &trans)) return 0; return 1; } #endif /* PLATFORM */ #endif /* __SPI_HARDWARE_ATY */ #endif /* __HW_SPI_ATY_C */ /******************************** End Of File *********************************/