auto-sync
This commit is contained in:
parent
198ca2dc40
commit
1af06be619
|
@ -31,6 +31,7 @@
|
||||||
#include "rpm_calculator.h"
|
#include "rpm_calculator.h"
|
||||||
#include "trigger_central.h"
|
#include "trigger_central.h"
|
||||||
#include "hip9011_lookup.h"
|
#include "hip9011_lookup.h"
|
||||||
|
#include "HIP9011.h"
|
||||||
|
|
||||||
#if EFI_HIP_9011 || defined(__DOXYGEN__)
|
#if EFI_HIP_9011 || defined(__DOXYGEN__)
|
||||||
|
|
||||||
|
@ -42,8 +43,9 @@ extern pin_output_mode_e DEFAULT_OUTPUT;
|
||||||
* band index is only send to HIP chip on startup
|
* band index is only send to HIP chip on startup
|
||||||
*/
|
*/
|
||||||
static int bandIndex;
|
static int bandIndex;
|
||||||
static int currentGainIndex;
|
static int currentGainIndex = -1;
|
||||||
static int currentIntergratorIndex = -1;
|
static int currentIntergratorIndex = -1;
|
||||||
|
static int settingUpdateCount = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Int/Hold pin is controlled from scheduler callbacks which are set according to current RPM
|
* Int/Hold pin is controlled from scheduler callbacks which are set according to current RPM
|
||||||
|
@ -51,7 +53,10 @@ static int currentIntergratorIndex = -1;
|
||||||
* The following flags make sure that we only have SPI communication while not integrating
|
* The following flags make sure that we only have SPI communication while not integrating
|
||||||
*/
|
*/
|
||||||
static bool_t isIntegrating = false;
|
static bool_t isIntegrating = false;
|
||||||
static bool_t needToSendSpiCommand = false;
|
/**
|
||||||
|
* true by default so that we can update the settings before starting to integrate
|
||||||
|
*/
|
||||||
|
static bool_t needToSendSpiCommand = true;
|
||||||
|
|
||||||
static scheduling_s startTimer[2];
|
static scheduling_s startTimer[2];
|
||||||
static scheduling_s endTimer[2];
|
static scheduling_s endTimer[2];
|
||||||
|
@ -83,63 +88,54 @@ static unsigned char rx_buff[1];
|
||||||
// todo: make this configurable
|
// todo: make this configurable
|
||||||
static SPIDriver *driver = &SPID2;
|
static SPIDriver *driver = &SPID2;
|
||||||
|
|
||||||
|
EXTERN_ENGINE
|
||||||
|
;
|
||||||
|
|
||||||
static msg_t ivThread(int param) {
|
static msg_t ivThread(int param) {
|
||||||
chRegSetThreadName("HIP");
|
chRegSetThreadName("HIP");
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
chThdSleepMilliseconds(10);
|
/**
|
||||||
|
* do we need this configurable? probably not
|
||||||
|
*/
|
||||||
|
chThdSleepMilliseconds(HIP_THREAD_PERIOD);
|
||||||
|
|
||||||
// engine->rpmCalculator.rpmValue
|
int integratorIndex = getIntegrationIndexByRpm(engine->rpmCalculator.rpmValue);
|
||||||
|
int gainIndex = getHip9011GainIndex(boardConfiguration->hip9011Gain);
|
||||||
|
|
||||||
// int newValue = INTEGRATOR_INDEX;
|
if (currentGainIndex != gainIndex || currentIntergratorIndex != integratorIndex) {
|
||||||
// if (newValue != intergratorIndex) {
|
needToSendSpiCommand = true;
|
||||||
// intergratorIndex = newValue;
|
}
|
||||||
// // todo: send new value, be sure to use non-synchnonious approach!
|
|
||||||
//
|
|
||||||
// }
|
|
||||||
// todo: move this into the end callback
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loop if nothing has really changed
|
||||||
|
*/
|
||||||
|
if (!needToSendSpiCommand)
|
||||||
|
continue;
|
||||||
|
/**
|
||||||
|
* Loop if the chip is busy. The 'needToSend' flag would prevent next integration, but we
|
||||||
|
* need to let current integration finish
|
||||||
|
*/
|
||||||
|
if (isIntegrating)
|
||||||
|
continue;
|
||||||
|
settingUpdateCount++;
|
||||||
|
|
||||||
// scheduleMsg(&logger, "poking HIP=%d", counter++);
|
SPI_SYNCHRONOUS(SET_GAIN_CMD + gainIndex);
|
||||||
|
currentGainIndex = gainIndex;
|
||||||
|
|
||||||
spiSelect(driver);
|
SPI_SYNCHRONOUS(SET_INTEGRATOR_CMD + integratorIndex);
|
||||||
|
currentIntergratorIndex = integratorIndex;
|
||||||
|
|
||||||
// // '0' for 4MHz
|
needToSendSpiCommand = false;
|
||||||
// tx_buff[0] = SET_PRESCALER_CMD + 0 + 2;
|
|
||||||
// spiExchange(driver, 1, tx_buff, rx_buff);
|
|
||||||
//
|
|
||||||
// // '0' for channel #1
|
|
||||||
// tx_buff[0] = SET_CHANNEL_CMD + 0;
|
|
||||||
// spiExchange(driver, 1, tx_buff, rx_buff);
|
|
||||||
//
|
|
||||||
// // band index depends on cylinder bore
|
|
||||||
// tx_buff[0] = SET_BAND_PASS_CMD + bandIndex;
|
|
||||||
// spiExchange(driver, 1, tx_buff, rx_buff);
|
|
||||||
//
|
|
||||||
// // todo
|
|
||||||
// tx_buff[0] = SET_GAIN_CMD + 41;
|
|
||||||
// spiExchange(driver, 1, tx_buff, rx_buff);
|
|
||||||
//
|
|
||||||
// tx_buff[0] = SET_ADVANCED_MODE;
|
|
||||||
// spiExchange(driver, 1, tx_buff, rx_buff);
|
|
||||||
|
|
||||||
// BAND_PASS_CMD
|
//// BAND_PASS_CMD
|
||||||
tx_buff[0] = 0x0 | (40 & 0x3F);
|
// SPI_SYNCHRONOUS(0x0 | (40 & 0x3F));
|
||||||
spiExchange(driver, 1, tx_buff, rx_buff);
|
// // Set the gain 0b10000000
|
||||||
|
// SPI_SYNCHRONOUS(0x80 | (49 & 0x3F));
|
||||||
// Set the gain 0b10000000
|
// // Set the integration time constant 0b11000000
|
||||||
tx_buff[0] = 0x80 | (49 & 0x3F);
|
// SPI_SYNCHRONOUS(0xC0 | (31 & 0x1F));
|
||||||
spiExchange(driver, 1, tx_buff, rx_buff);
|
// // SET_ADVANCED_MODE 0b01110001
|
||||||
|
// SPI_SYNCHRONOUS(tx_buff[0] = 0x71;)
|
||||||
// Set the integration time constant 0b11000000
|
|
||||||
tx_buff[0] = 0xC0 | (31 & 0x1F);
|
|
||||||
spiExchange(driver, 1, tx_buff, rx_buff);
|
|
||||||
|
|
||||||
// SET_ADVANCED_MODE 0b01110001
|
|
||||||
tx_buff[0] = 0x71;
|
|
||||||
spiExchange(driver, 1, tx_buff, rx_buff);
|
|
||||||
|
|
||||||
spiUnselect(driver);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
#if defined __GNUC__
|
#if defined __GNUC__
|
||||||
|
@ -148,19 +144,15 @@ static msg_t ivThread(int param) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EXTERN_ENGINE
|
|
||||||
;
|
|
||||||
|
|
||||||
static void showHipInfo(void) {
|
static void showHipInfo(void) {
|
||||||
printSpiState(&logger, boardConfiguration);
|
printSpiState(&logger, boardConfiguration);
|
||||||
scheduleMsg(&logger, "bore=%f freq=%f", engineConfiguration->cylinderBore, BAND(engineConfiguration->cylinderBore));
|
scheduleMsg(&logger, "bore=%f freq=%f", engineConfiguration->cylinderBore, BAND(engineConfiguration->cylinderBore));
|
||||||
|
|
||||||
scheduleMsg(&logger, "band_index=%d gain_index=%d", bandIndex, GAIN_INDEX(boardConfiguration->hip9011Gain));
|
scheduleMsg(&logger, "band_index=%d gain_index=%d", bandIndex, currentGainIndex);
|
||||||
|
|
||||||
scheduleMsg(&logger, "integrator index=%d", currentIntergratorIndex);
|
scheduleMsg(&logger, "integrator index=%d", currentIntergratorIndex);
|
||||||
|
|
||||||
scheduleMsg(&logger, "spi= int=%s CS=%s", hwPortname(boardConfiguration->hip9011IntHoldPin),
|
scheduleMsg(&logger, "spi= int=%s CS=%s updateCount=%d", hwPortname(boardConfiguration->hip9011IntHoldPin),
|
||||||
hwPortname(boardConfiguration->hip9011CsPin));
|
hwPortname(boardConfiguration->hip9011CsPin), settingUpdateCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
void setHip9011FrankensoPinout(void) {
|
void setHip9011FrankensoPinout(void) {
|
||||||
|
@ -227,9 +219,12 @@ void initHip9011(void) {
|
||||||
return;
|
return;
|
||||||
initLogging(&logger, "HIP driver");
|
initLogging(&logger, "HIP driver");
|
||||||
|
|
||||||
// prepa engineConfiguration->knockDetectionWindowEnd - engineConfiguration->knockDetectionWindowStart
|
// todo: apply new properties on the fly
|
||||||
|
prepareHip9011RpmLookup(
|
||||||
|
engineConfiguration->knockDetectionWindowEnd - engineConfiguration->knockDetectionWindowStart);
|
||||||
|
|
||||||
// driver = getSpiDevice(boardConfiguration->digitalPotentiometerSpiDevice);
|
// todo: configurable
|
||||||
|
// driver = getSpiDevice(boardConfiguration->hip9011SpiDevice);
|
||||||
|
|
||||||
spicfg.ssport = getHwPort(boardConfiguration->hip9011CsPin);
|
spicfg.ssport = getHwPort(boardConfiguration->hip9011CsPin);
|
||||||
spicfg.sspad = getHwPin(boardConfiguration->hip9011CsPin);
|
spicfg.sspad = getHwPin(boardConfiguration->hip9011CsPin);
|
||||||
|
@ -240,19 +235,11 @@ void initHip9011(void) {
|
||||||
scheduleMsg(&logger, "Starting HIP9011/TPIC8101 driver");
|
scheduleMsg(&logger, "Starting HIP9011/TPIC8101 driver");
|
||||||
spiStart(driver, &spicfg);
|
spiStart(driver, &spicfg);
|
||||||
|
|
||||||
chThdCreateStatic(htThreadStack, sizeof(htThreadStack), NORMALPRIO,
|
|
||||||
(tfunc_t) ivThread, NULL);
|
|
||||||
//#else
|
|
||||||
// /**
|
|
||||||
// * for runtime we are re-starting SPI in non-synchronous mode
|
|
||||||
// */
|
|
||||||
// spiStop(driver);
|
|
||||||
// // todo spicfg.end_cb = spiEndCallback;
|
|
||||||
// spiStart(driver, &spicfg);
|
|
||||||
//#endif /* HIP_DEBUG */
|
|
||||||
|
|
||||||
bandIndex = getHip9011BandIndex(engineConfiguration->cylinderBore);
|
bandIndex = getHip9011BandIndex(engineConfiguration->cylinderBore);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* this engine cycle callback would be scheduling actual integration start and end callbacks
|
||||||
|
*/
|
||||||
addTriggerEventListener(&intHoldCallback, "DD int/hold", engine);
|
addTriggerEventListener(&intHoldCallback, "DD int/hold", engine);
|
||||||
|
|
||||||
// MISO PB14
|
// MISO PB14
|
||||||
|
@ -262,6 +249,17 @@ void initHip9011(void) {
|
||||||
|
|
||||||
addConsoleAction("hipinfo", showHipInfo);
|
addConsoleAction("hipinfo", showHipInfo);
|
||||||
addConsoleActionF("set_gain", setGain);
|
addConsoleActionF("set_gain", setGain);
|
||||||
|
|
||||||
|
// '0' for 4MHz
|
||||||
|
SPI_SYNCHRONOUS(SET_PRESCALER_CMD + 0);
|
||||||
|
|
||||||
|
// '0' for channel #1
|
||||||
|
SPI_SYNCHRONOUS(SET_CHANNEL_CMD + 0);
|
||||||
|
|
||||||
|
// band index depends on cylinder bore
|
||||||
|
SPI_SYNCHRONOUS(SET_BAND_PASS_CMD + bandIndex);
|
||||||
|
|
||||||
|
chThdCreateStatic(htThreadStack, sizeof(htThreadStack), NORMALPRIO, (tfunc_t) ivThread, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -15,6 +15,9 @@
|
||||||
// 0b11100000
|
// 0b11100000
|
||||||
#define SET_CHANNEL_CMD 0xE0
|
#define SET_CHANNEL_CMD 0xE0
|
||||||
|
|
||||||
|
// 0b11000000
|
||||||
|
#define SET_INTEGRATOR_CMD 0xC0
|
||||||
|
|
||||||
// 0b00000000
|
// 0b00000000
|
||||||
#define SET_BAND_PASS_CMD 0x0
|
#define SET_BAND_PASS_CMD 0x0
|
||||||
|
|
||||||
|
@ -22,7 +25,9 @@
|
||||||
#define SET_GAIN_CMD 0x80
|
#define SET_GAIN_CMD 0x80
|
||||||
|
|
||||||
// 0b01110001
|
// 0b01110001
|
||||||
#define SET_ADVANCED_MODE 0x71
|
//#define SET_ADVANCED_MODE 0x71
|
||||||
|
|
||||||
|
#define HIP_THREAD_PERIOD 100
|
||||||
|
|
||||||
void initHip9011(void);
|
void initHip9011(void);
|
||||||
void setHip9011FrankensoPinout(void);
|
void setHip9011FrankensoPinout(void);
|
||||||
|
|
Loading…
Reference in New Issue