272 lines
8.1 KiB
C
272 lines
8.1 KiB
C
//
|
|
// Created by cfif on 03.06.2024.
|
|
//
|
|
#include "SensorSPI.h"
|
|
#include "SystemDelayInterface.h"
|
|
|
|
static void setSensorTypeAdr(tSensorSPI *env, tConABC *connABC, uint8_t adr) {
|
|
|
|
switch (adr) {
|
|
case 0: {
|
|
GpioPinSet(&connABC->A, false);
|
|
GpioPinSet(&connABC->B, false);
|
|
GpioPinSet(&connABC->C, false);
|
|
break;
|
|
}
|
|
case 1: {
|
|
GpioPinSet(&connABC->A, true);
|
|
GpioPinSet(&connABC->B, false);
|
|
GpioPinSet(&connABC->C, false);
|
|
break;
|
|
}
|
|
case 2: {
|
|
GpioPinSet(&connABC->A, false);
|
|
GpioPinSet(&connABC->B, true);
|
|
GpioPinSet(&connABC->C, false);
|
|
break;
|
|
}
|
|
case 3: {
|
|
GpioPinSet(&connABC->A, true);
|
|
GpioPinSet(&connABC->B, true);
|
|
GpioPinSet(&connABC->C, false);
|
|
break;
|
|
}
|
|
case 4: {
|
|
GpioPinSet(&connABC->A, false);
|
|
GpioPinSet(&connABC->B, false);
|
|
GpioPinSet(&connABC->C, true);
|
|
break;
|
|
}
|
|
case 5: {
|
|
GpioPinSet(&connABC->A, true);
|
|
GpioPinSet(&connABC->B, false);
|
|
GpioPinSet(&connABC->C, true);
|
|
break;
|
|
}
|
|
case 6: {
|
|
GpioPinSet(&connABC->A, false);
|
|
GpioPinSet(&connABC->B, true);
|
|
GpioPinSet(&connABC->C, true);
|
|
break;
|
|
}
|
|
case 7: {
|
|
GpioPinSet(&connABC->A, true);
|
|
GpioPinSet(&connABC->B, true);
|
|
GpioPinSet(&connABC->C, true);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
#define DelayCn 1000
|
|
|
|
static void Delay(uint32_t count) {
|
|
for (uint32_t i = 0; i < count; ++i) {
|
|
__asm__ volatile("nop");
|
|
}
|
|
}
|
|
|
|
|
|
bool setSpiSensor(tSensorSPI *env, tSensorType sensorType, tSensorAdr sensorAdr, uint16_t data) {
|
|
|
|
switch (sensorType) {
|
|
|
|
case SENSOR_TYPE_A: {
|
|
|
|
bool result = false;
|
|
|
|
|
|
if (sensorAdr >= SENSOR_ADR_9) {
|
|
setSensorTypeAdr(env, &env->conns->COON_A.Con, sensorAdr - SENSOR_ADR_9);
|
|
Delay(DelayCn);
|
|
|
|
GpioPinSet(&env->conns->COON_A.En1, true);
|
|
GpioPinSet(&env->conns->COON_A.En2, false); // CS En2
|
|
} else {
|
|
setSensorTypeAdr(env, &env->conns->COON_A.Con, sensorAdr);
|
|
Delay(DelayCn);
|
|
|
|
GpioPinSet(&env->conns->COON_A.En1, false); // CS En1
|
|
GpioPinSet(&env->conns->COON_A.En2, true);
|
|
}
|
|
|
|
Delay(DelayCn);
|
|
result = SpiPortTransmit(&env->spiPorts->Spi1_IO, &data, 1000);
|
|
Delay(DelayCn);
|
|
|
|
GpioPinSet(&env->conns->COON_A.En1, true);
|
|
GpioPinSet(&env->conns->COON_A.En2, true);
|
|
|
|
Delay(DelayCn);
|
|
return result;
|
|
}
|
|
|
|
|
|
case SENSOR_TYPE_B: {
|
|
bool result = false;
|
|
|
|
// Эти управляются мультиплексором SENSOR_TYPE_A
|
|
if ((sensorAdr == SENSOR_ADR_9) || (sensorAdr == SENSOR_ADR_10)) {
|
|
|
|
if (sensorAdr == SENSOR_ADR_9) {
|
|
setSensorTypeAdr(env, &env->conns->COON_A.Con, SENSOR_ADR_7);
|
|
}
|
|
|
|
if (sensorAdr == SENSOR_ADR_10) {
|
|
setSensorTypeAdr(env, &env->conns->COON_A.Con, SENSOR_ADR_8);
|
|
}
|
|
|
|
GpioPinSet(&env->conns->COON_A.En1, true);
|
|
GpioPinSet(&env->conns->COON_A.En2, false); // CS En2
|
|
|
|
Delay(DelayCn);
|
|
// Только тут SPI2
|
|
result = SpiPortTransmit(&env->spiPorts->Spi2_IO, &data, 1000);
|
|
Delay(DelayCn);
|
|
|
|
GpioPinSet(&env->conns->COON_A.En1, true);
|
|
GpioPinSet(&env->conns->COON_A.En2, true);
|
|
|
|
Delay(DelayCn);
|
|
} else {
|
|
|
|
|
|
setSensorTypeAdr(env, &env->conns->COON_B.Con, sensorAdr);
|
|
|
|
Delay(DelayCn);
|
|
result = SpiPortTransmit(&env->spiPorts->Spi2_IO, &data, 1000);
|
|
Delay(DelayCn);
|
|
|
|
GpioPinSet(&env->conns->COON_B.En1, true);
|
|
}
|
|
|
|
Delay(DelayCn);
|
|
return result;
|
|
}
|
|
|
|
|
|
case SENSOR_TYPE_E: {
|
|
|
|
if (sensorAdr >= SENSOR_ADR_9) {
|
|
setSensorTypeAdr(env, &env->conns->COON_E.Con, sensorAdr - SENSOR_ADR_9);
|
|
Delay(DelayCn);
|
|
|
|
GpioPinSet(&env->conns->COON_E.En1, true);
|
|
GpioPinSet(&env->conns->COON_E.En2, false); // CS En2
|
|
} else {
|
|
setSensorTypeAdr(env, &env->conns->COON_E.Con, sensorAdr);
|
|
Delay(DelayCn);
|
|
|
|
GpioPinSet(&env->conns->COON_E.En1, false); // CS En1
|
|
GpioPinSet(&env->conns->COON_E.En2, true);
|
|
}
|
|
|
|
Delay(DelayCn);
|
|
bool result = SpiPortTransmit(&env->spiPorts->Spi3_IO, &data, 1000);
|
|
Delay(DelayCn);
|
|
|
|
GpioPinSet(&env->conns->COON_E.En1, true);
|
|
GpioPinSet(&env->conns->COON_E.En2, true);
|
|
|
|
Delay(DelayCn);
|
|
return result;
|
|
}
|
|
|
|
|
|
case SENSOR_TYPE_D: {
|
|
bool result = false;
|
|
|
|
// Эти управляются мультиплексором SENSOR_TYPE_E
|
|
if ((sensorAdr == SENSOR_ADR_9) || (sensorAdr == SENSOR_ADR_10)) {
|
|
|
|
if (sensorAdr == SENSOR_ADR_9) {
|
|
setSensorTypeAdr(env, &env->conns->COON_E.Con, SENSOR_ADR_5);
|
|
}
|
|
|
|
if (sensorAdr == SENSOR_ADR_10) {
|
|
setSensorTypeAdr(env, &env->conns->COON_E.Con, SENSOR_ADR_6);
|
|
}
|
|
|
|
Delay(DelayCn);
|
|
|
|
GpioPinSet(&env->conns->COON_E.En1, true);
|
|
GpioPinSet(&env->conns->COON_E.En2, false); // CS En2
|
|
|
|
Delay(DelayCn);
|
|
result = SpiPortTransmit(&env->spiPorts->Spi3_IO, &data, 1000);
|
|
Delay(DelayCn);
|
|
|
|
GpioPinSet(&env->conns->COON_E.En1, true);
|
|
GpioPinSet(&env->conns->COON_E.En2, true);
|
|
|
|
} else {
|
|
|
|
GpioPinSet(&env->conns->COON_D.En1, false); // CS En1
|
|
Delay(DelayCn);
|
|
|
|
setSensorTypeAdr(env, &env->conns->COON_D.Con, sensorAdr);
|
|
|
|
Delay(DelayCn);
|
|
result = SpiPortTransmit(&env->spiPorts->Spi3_IO, &data, 1000);
|
|
Delay(DelayCn);
|
|
|
|
GpioPinSet(&env->conns->COON_D.En1, true);
|
|
}
|
|
|
|
Delay(DelayCn);
|
|
return result;
|
|
}
|
|
|
|
|
|
case SENSOR_TYPE_F: {
|
|
|
|
if (sensorAdr >= SENSOR_ADR_17) {
|
|
setSensorTypeAdr(env, &env->conns->COON_F.Con, sensorAdr - SENSOR_ADR_17);
|
|
Delay(DelayCn);
|
|
|
|
GpioPinSet(&env->conns->COON_F.En1, true);
|
|
GpioPinSet(&env->conns->COON_F.En2, true);
|
|
GpioPinSet(&env->conns->COON_F.En3, false); // CS En3
|
|
} else {
|
|
|
|
if (sensorAdr >= SENSOR_ADR_9) {
|
|
setSensorTypeAdr(env, &env->conns->COON_F.Con, sensorAdr - SENSOR_ADR_9);
|
|
Delay(DelayCn);
|
|
|
|
GpioPinSet(&env->conns->COON_F.En1, true);
|
|
GpioPinSet(&env->conns->COON_F.En2, false); // CS En2
|
|
GpioPinSet(&env->conns->COON_F.En3, true);
|
|
} else {
|
|
setSensorTypeAdr(env, &env->conns->COON_F.Con, sensorAdr);
|
|
Delay(DelayCn);
|
|
|
|
GpioPinSet(&env->conns->COON_F.En1, false); // CS En1
|
|
GpioPinSet(&env->conns->COON_F.En2, true);
|
|
GpioPinSet(&env->conns->COON_F.En3, true);
|
|
}
|
|
|
|
}
|
|
|
|
Delay(DelayCn);
|
|
bool result = SpiPortTransmit(&env->spiPorts->Spi4_IO, &data, 1000);
|
|
Delay(DelayCn);
|
|
|
|
GpioPinSet(&env->conns->COON_F.En1, true);
|
|
GpioPinSet(&env->conns->COON_F.En2, true);
|
|
GpioPinSet(&env->conns->COON_F.En3, true);
|
|
|
|
|
|
Delay(DelayCn);
|
|
return result;
|
|
}
|
|
|
|
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
void SensorSpi_Init(tSensorSPI *env, tSpiPorts *spiPorts, tConns *conns) {
|
|
env->spiPorts = spiPorts;
|
|
env->conns = conns;
|
|
} |