This commit is contained in:
cfif 2024-12-04 13:10:48 +03:00
commit 18ee7d6eb1
3 changed files with 170 additions and 0 deletions

32
Inc/SpiPortNation.h Normal file
View File

@ -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

111
Src/SpiPortNation.c Normal file
View File

@ -0,0 +1,111 @@
//
// Created by cfif on 16.09.22.
//
#include <SystemDelayInterface.h>
#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;
}

27
modular.json Normal file
View File

@ -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"
]
}
}