From 18ee7d6eb11b294ca387f14c4c55307b50104abb Mon Sep 17 00:00:00 2001 From: cfif Date: Wed, 4 Dec 2024 13:10:48 +0300 Subject: [PATCH] Init --- Inc/SpiPortNation.h | 32 +++++++++++++ Src/SpiPortNation.c | 111 ++++++++++++++++++++++++++++++++++++++++++++ modular.json | 27 +++++++++++ 3 files changed, 170 insertions(+) create mode 100644 Inc/SpiPortNation.h create mode 100644 Src/SpiPortNation.c create mode 100644 modular.json diff --git a/Inc/SpiPortNation.h b/Inc/SpiPortNation.h new file mode 100644 index 0000000..3e05a58 --- /dev/null +++ b/Inc/SpiPortNation.h @@ -0,0 +1,32 @@ +// +// Created by cfif on 28.09.22. +// + +#ifndef SPIPORT_NATION_H +#define SPIPORT_NATION_H + +#include "SpiPort.h" +#include "n32g45x.h" +#include "cmsis_os2.h" +#include "GpioPinInterface.h" + +typedef struct { + SPI_Module *spi; + //решение на случай одного чипа на шине + tGpioPin *chipSelect; +} tSpiPortNation; + +tSpiPortNation SpiPort_Init( + SPI_Module *spi, + uint16_t spiFrameBit, + tGpioPin *chipSelect +); + + +#define SpiPort_InitName(NAME, spiFrameBit, CS) \ +SpiPort_Init(NAME, spiFrameBit, CS) + + +tSpiPortIO SpiPort_GetIo(tSpiPortNation *env); + +#endif //SPIPORT_NATION_H diff --git a/Src/SpiPortNation.c b/Src/SpiPortNation.c new file mode 100644 index 0000000..d2f21da --- /dev/null +++ b/Src/SpiPortNation.c @@ -0,0 +1,111 @@ +// +// Created by cfif on 16.09.22. +// +#include +#include "SpiPortNation.h" + + +tSpiPortNation SpiPort_Init( + SPI_Module *spi, + uint16_t spiFrameBit, + tGpioPin *chipSelect +) { + SPI_InitType spi_init_struct; + + spi_init_struct.DataDirection = SPI_DIR_DOUBLELINE_FULLDUPLEX; + spi_init_struct.SpiMode = SPI_MODE_MASTER; + spi_init_struct.DataLen = spiFrameBit; + spi_init_struct.CLKPOL = SPI_CLKPOL_LOW; + spi_init_struct.CLKPHA = SPI_CLKPHA_FIRST_EDGE; + spi_init_struct.NSS = SPI_NSS_SOFT; + spi_init_struct.BaudRatePres = SPI_BR_PRESCALER_8; + spi_init_struct.FirstBit = SPI_FB_MSB; + SPI_Init(spi, &spi_init_struct); + + SPI_Enable(spi, ENABLE); + + tSpiPortNation spiPort = { + .spi = spi, + .chipSelect = chipSelect + }; + + return spiPort; +} + + +static bool vSpiPortTransmit(tSpiPortNation *env, const uint16_t *data, uint32_t timeout) { + + uint32_t endMs = SystemGetMs() + timeout; + + while ((timeout == SystemWaitForever) || (endMs > SystemGetMs())) { + // Буфер передатчика пуст + if (SPI_I2S_GetStatus(env->spi, SPI_I2S_TE_FLAG)) { + SPI_I2S_TransmitData(env->spi, *data); + + return true; + } + } + return false; +} +static bool vSpiPortReceive(tSpiPortNation *env, uint16_t *data, uint32_t timeout) { + + uint32_t endMs = SystemGetMs() + timeout; + while ((timeout == SystemWaitForever) || (endMs > SystemGetMs())) { + // В буфере приемника еcть данные + if (SPI_I2S_GetStatus(env->spi, SPI_I2S_RNE_FLAG)) { + *data = SPI_I2S_ReceiveData(env->spi); + return true; + } + } + + return false; +} + +static bool vSpiPortSovTransmit(tSpiPortNation *env, const uint16_t *data, uint32_t timeout) { + + uint32_t endMs = SystemGetMs() + timeout; + + while ((timeout == SystemWaitForever) || (endMs > SystemGetMs())) { + // Буфер передатчика пуст + if (SPI_I2S_GetStatus(env->spi, SPI_I2S_TE_FLAG)) { + SPI_I2S_TransmitData(env->spi, *data);vSpiPortReceive (env,data,timeout); + return true; + } + } + return false; +} + +static bool vSpiPortSovReceive(tSpiPortNation *env, uint16_t *data, uint32_t timeout) { + uint32_t endMs = SystemGetMs() + timeout; + vSpiPortTransmit (env,data,timeout); + while ((timeout == SystemWaitForever) || (endMs > SystemGetMs())) { + // В буфере приемника еcть данные + if (SPI_I2S_GetStatus(env->spi, SPI_I2S_RNE_FLAG)) { + *data = SPI_I2S_ReceiveData(env->spi); + return true; + } + } + return false; +} + +//простая реализация chipSelect для одного утройства на шине +static bool vSpiPortChipSelectMono(tSpiPortNation *env, uint32_t timeout) { + GpioPinEnable(env->chipSelect); + return true; +} + +static bool vSpiPortChipReleaseMono(tSpiPortNation *env, uint32_t timeout) { + GpioPinDisable(env->chipSelect); + return true; +} + +tSpiPortIO SpiPort_GetIo(tSpiPortNation *env) { + tSpiPortIO io = { + .env = env, + .receive = (SpiPortIOTransaction) vSpiPortSovReceive, + .transmit = (SpiPortIOTransaction) vSpiPortSovTransmit, + .chipSelect =(SpiPortChipArbitrage) vSpiPortChipSelectMono, + .chipRelease =(SpiPortChipArbitrage) vSpiPortChipReleaseMono, + }; + return io; +} \ No newline at end of file diff --git a/modular.json b/modular.json new file mode 100644 index 0000000..a284c41 --- /dev/null +++ b/modular.json @@ -0,0 +1,27 @@ +{ + "dep": [ + { + "type": "git", + "provider": "NAVIGATOR_UVEOS_NATION_TELIT", + "repo": "PeripheralDriver_NATION_N32G45X" + }, + { + "type": "git", + "provider": "NAVIGATOR_UVEOS_NATION_TELIT", + "repo": "SpiPort" + }, + { + "type": "git", + "provider": "NAVIGATOR_UVEOS_NATION_TELIT", + "repo": "SystemDelayInterface" + } + ], + "cmake": { + "inc_dirs": [ + "Inc" + ], + "srcs": [ + "Src/**.c" + ] + } +} \ No newline at end of file