/** * @file HW_SPI_ATY.c * * @param Project DEVICE_GENERAL_ATY_LIB * * @author ATY * * @copyright * - Copyright 2017 - 2025 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 * - 1_01_240111 > ATY * -# add multy addr and channel * -# add lock * -Undone: in soft ******************************************************************************** */ #ifndef __HW_SPI_ATY_C #define __HW_SPI_ATY_C #include "HW_SPI_ATY.h" /******************************* For user *************************************/ /******************************************************************************/ /** * @brief * * @param data_t * @param len * @param dev * @return uint8_t */ uint8_t SPI_Write(uint8_t* data_t, uint16_t len, struct HW_SPI_ATY_Dev* dev) { if(dev->hardwareEnable == 1){ uint8_t errCode = 0; __ATY_LOCK(dev); errCode = dev->spiProcess(data_t, len, _ATY_RW_W); __ATY_UNLOCK(dev); return errCode; } else{ __ATY_UNLOCK(dev); return 1; } } /** * @brief * * @param data_t * @param len * @param dev * @return uint8_t */ uint8_t SPI_Read(uint8_t* data_t, uint16_t len, struct HW_SPI_ATY_Dev* dev) { if(dev->hardwareEnable == 1){ uint8_t errCode = 0; __ATY_LOCK(dev); errCode = dev->spiProcess(data_t, len, _ATY_RW_R); __ATY_UNLOCK(dev); return errCode; } else{ __ATY_UNLOCK(dev); return 1; } } /** * @brief * * @param data_t * @param len * @param dev * @return uint8_t */ uint8_t SPI_ReadWrite(uint8_t* data_t, uint16_t len, struct HW_SPI_ATY_Dev* dev) { if(dev->hardwareEnable == 1){ uint8_t errCode = 0; __ATY_LOCK(dev); errCode = dev->spiProcess(data_t, len, _ATY_RW_RW); __ATY_UNLOCK(dev); return errCode; } else{ __ATY_UNLOCK(dev); return 1; } } #endif /* __HW_SPI_ATY_C */ /************************************ etc *************************************/ /* init */ // // STM32 HAL // uint8_t SPI_1(uint8_t* data_t, uint8_t len, uint8_t rw){ // if(rw == _ATY_RW_W) // return HAL_SPI_Transmit(&hspi2, (uint8_t*)data_t, len, 1000); // else if(rw == _ATY_RW_R) // return HAL_SPI_Receive(&hspi2, (uint8_t*)data_t, len, 1000); // else if(rw == _ATY_RW_RW) // return HAL_SPI_TransmitReceive(&hspi2, (uint8_t*)data_t, (uint8_t*)data_t, len, 1000); // return 0; // } // // 51 // todo: not tested // uint8_t SPI_1(uint8_t* data_t, uint8_t len, uint8_t rw){ // if(rw == _ATY_RW_W){ // 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; else errCount = 1000; // } // return 0; // } // else if(rw == _ATY_RW_R){ // 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(errCount == 0) return 1; else errCount = 1000; // data_t[i] = SPDAT; // } // return 0; // } // else if(rw == _ATY_RW_RW){ // uint8_t i = 0; // uint16_t errCount = 1000; // SPCTL = 0xD4; // SPSTAT |= 0xC0; // SPDAT = data_t[0]; // while(((SPSTAT & 0x80) != 0x80) && errCount) errCount--; // if(errCount == 0) return 1; else errCount = 1000; // SPCTL = 0xD4; // for(i = 0; i < len; i++) // { // SPSTAT |= 0xC0; // SPDAT = 0xFF; // while(((SPSTAT & 0x80) != 0x80) && errCount) errCount--; // if(errCount == 0) return 1; else errCount = 1000; // data_t[i] = SPDAT; // } // return 0; // } // return 0; // } // // ESP8266_RTOS // todo: not tested // #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; // } // void SPI_Delay(uint8_t t){ } // struct HW_SPI_ATY_Dev HW_SPI_ATY_Dev_1 = { // .hardwareEnable = 1, // .spiProcess = SPI_1, // .delay = SPI_Delay, // .lock = _ATY_UNLOCKED, // .debugEnable = 0, // .LOG = printf // }; /* use */ // SPI_Write(data_t, len, &HW_SPI_ATY_Dev_1); // SPI_Read(data_t, len, &HW_SPI_ATY_Dev_1); // SPI_ReadWrite(data_t, len, &HW_SPI_ATY_Dev_1); /******************************************************************************/ /******************************** End Of File *********************************/