| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255 |
- /**
- * @file HW_SPI_ATY.c
- *
- * @param Project DEVICE_GENERAL_ATY_LIB
- *
- * @author ATY
- *
- * @copyright
- * - Copyright 2017 - 2026 MZ-ATY
- * - This code follows:
- * - MZ-ATY Various Contents Joint Statement -
- * <a href="https://mengze.top/MZ-ATY_VCJS">
- * https://mengze.top/MZ-ATY_VCJS</a>
- * - CC 4.0 BY-NC-SA -
- * <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">
- * https://creativecommons.org/licenses/by-nc-sa/4.0/</a>
- * - Your use will be deemed to have accepted the terms of this statement.
- *
- * @brief functions of SPI for C platform
- *
- * @version
- * - 1_01_221028 > ATY
- * -# Preliminary version, first Release
- * - 1_02_240111 > ATY
- * -# add multy addr and channel
- * -# add lock
- * - 1_03_251114 > ATY
- * -# remove delay
- * @todo
- * - all test
- ********************************************************************************
- */
- #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 <stdio.h>
- // #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;
- // }
- // struct HW_SPI_ATY_Dev HW_SPI_ATY_Dev_1 = {
- // .hardwareEnable = 1,
- // .spiProcess = SPI_1,
- // .lock = __ATY_UNLOCKED
- // };
- /* 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 *********************************/
|