1
0
forked from me/IronOS

More FRToS I2C cleanup

This commit is contained in:
Ben V. Brown
2018-04-14 16:33:16 +10:00
parent 7c1937b412
commit 576575d7ba
4 changed files with 34 additions and 27 deletions

View File

@@ -14,9 +14,7 @@ class FRToSI2C {
public: public:
FRToSI2C(I2C_HandleTypeDef* i2chandle); FRToSI2C(I2C_HandleTypeDef* i2chandle);
void FRToSInit(); void FRToSInit();
void MasterTxCpltCallback(); //Normal Tx Callback void CpltCallback(); //Normal Tx Callback
void MemRxCpltCallback(); //Callback from memory read cycles
void MemTxCpltCallback(); //Callback from memory write cycles
void Mem_Read(uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, void Mem_Read(uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize,
uint8_t *pData, uint16_t Size); uint8_t *pData, uint16_t Size);
@@ -26,7 +24,6 @@ public:
void Transmit(uint16_t DevAddress, uint8_t *pData, uint16_t Size); void Transmit(uint16_t DevAddress, uint8_t *pData, uint16_t Size);
private: private:
bool RToSUP=false;
I2C_HandleTypeDef* i2c; I2C_HandleTypeDef* i2c;
SemaphoreHandle_t I2CSemaphore; SemaphoreHandle_t I2CSemaphore;
}; };

View File

@@ -26,10 +26,17 @@ enum ButtonState {
ButtonState getButtonState(); ButtonState getButtonState();
void waitForButtonPressOrTimeout(uint32_t timeout); void waitForButtonPressOrTimeout(uint32_t timeout);
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
void HAL_ADCEx_InjectedConvCpltCallback(ADC_HandleTypeDef* hadc); void HAL_ADCEx_InjectedConvCpltCallback(ADC_HandleTypeDef* hadc);
void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c);
void HAL_I2C_AbortCpltCallback(I2C_HandleTypeDef *hi2c);
void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c);
void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c);
void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c);
void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif /* __MAIN_H */ #endif /* __MAIN_H */

View File

@@ -9,24 +9,23 @@
FRToSI2C::FRToSI2C(I2C_HandleTypeDef* i2chandle) { FRToSI2C::FRToSI2C(I2C_HandleTypeDef* i2chandle) {
i2c = i2chandle; i2c = i2chandle;
I2CSemaphore = NULL;
} }
void FRToSI2C::MasterTxCpltCallback() { void FRToSI2C::CpltCallback() {
xSemaphoreGive(I2CSemaphore); BaseType_t xHigherPriorityTaskWoken = pdFALSE;
}
if (I2CSemaphore) {
xSemaphoreGiveFromISR(I2CSemaphore, &xHigherPriorityTaskWoken);
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}
void FRToSI2C::MemRxCpltCallback() {
xSemaphoreGive(I2CSemaphore);
}
void FRToSI2C::MemTxCpltCallback() {
xSemaphoreGive(I2CSemaphore);
} }
void FRToSI2C::Mem_Read(uint16_t DevAddress, uint16_t MemAddress, void FRToSI2C::Mem_Read(uint16_t DevAddress, uint16_t MemAddress,
uint16_t MemAddSize, uint8_t* pData, uint16_t Size) { uint16_t MemAddSize, uint8_t* pData, uint16_t Size) {
if (xTaskGetSchedulerState() == taskSCHEDULER_NOT_STARTED if (xTaskGetSchedulerState() == taskSCHEDULER_NOT_STARTED
|| RToSUP == false) { || I2CSemaphore == NULL) {
//no RToS, run blocking code //no RToS, run blocking code
HAL_I2C_Mem_Read(i2c, DevAddress, MemAddress, MemAddSize, pData, Size, HAL_I2C_Mem_Read(i2c, DevAddress, MemAddress, MemAddSize, pData, Size,
5000); 5000);
@@ -48,7 +47,7 @@ void FRToSI2C::Mem_Read(uint16_t DevAddress, uint16_t MemAddress,
void FRToSI2C::Mem_Write(uint16_t DevAddress, uint16_t MemAddress, void FRToSI2C::Mem_Write(uint16_t DevAddress, uint16_t MemAddress,
uint16_t MemAddSize, uint8_t* pData, uint16_t Size) { uint16_t MemAddSize, uint8_t* pData, uint16_t Size) {
if (xTaskGetSchedulerState() == taskSCHEDULER_NOT_STARTED if (xTaskGetSchedulerState() == taskSCHEDULER_NOT_STARTED
|| RToSUP == false) { || I2CSemaphore == NULL) {
//no RToS, run blocking code //no RToS, run blocking code
HAL_I2C_Mem_Write(i2c, DevAddress, MemAddress, MemAddSize, pData, Size, HAL_I2C_Mem_Write(i2c, DevAddress, MemAddress, MemAddSize, pData, Size,
5000); 5000);
@@ -70,12 +69,11 @@ void FRToSI2C::Mem_Write(uint16_t DevAddress, uint16_t MemAddress,
void FRToSI2C::FRToSInit() { void FRToSI2C::FRToSInit() {
I2CSemaphore = xSemaphoreCreateMutex(); I2CSemaphore = xSemaphoreCreateMutex();
xSemaphoreGive(I2CSemaphore); xSemaphoreGive(I2CSemaphore);
RToSUP = true;
} }
void FRToSI2C::Transmit(uint16_t DevAddress, uint8_t* pData, uint16_t Size) { void FRToSI2C::Transmit(uint16_t DevAddress, uint8_t* pData, uint16_t Size) {
if (xTaskGetSchedulerState() == taskSCHEDULER_NOT_STARTED if (xTaskGetSchedulerState() == taskSCHEDULER_NOT_STARTED
|| RToSUP == false) { || I2CSemaphore == NULL) {
//no RToS, run blocking code //no RToS, run blocking code
HAL_I2C_Master_Transmit(i2c, DevAddress, pData, Size, 5000); HAL_I2C_Master_Transmit(i2c, DevAddress, pData, Size, 5000);
} else { } else {
@@ -84,9 +82,7 @@ void FRToSI2C::Transmit(uint16_t DevAddress, uint8_t* pData, uint16_t Size) {
//Wait up to 1 second for the mutex //Wait up to 1 second for the mutex
if ( xSemaphoreTake( I2CSemaphore, ( TickType_t ) 1000 ) == pdTRUE) { if ( xSemaphoreTake( I2CSemaphore, ( TickType_t ) 1000 ) == pdTRUE) {
HAL_I2C_Master_Transmit(i2c, DevAddress, pData, Size, 5000); HAL_I2C_Master_Transmit(i2c, DevAddress, pData, Size, 5000);
xSemaphoreGive(I2CSemaphore); xSemaphoreGive(I2CSemaphore);
} }
} }

View File

@@ -1089,14 +1089,21 @@ void HAL_ADCEx_InjectedConvCpltCallback(ADC_HandleTypeDef* hadc) {
} }
void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c) { void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c) {
i2cDev.CpltCallback();
} }
void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c) { void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c) {
i2cDev.MasterTxCpltCallback(); i2cDev.CpltCallback();
} }
void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c) { void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c) {
i2cDev.MemTxCpltCallback();
}
void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c) { i2cDev.CpltCallback();
i2cDev.MemRxCpltCallback(); }
void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c){
i2cDev.CpltCallback();
}
void HAL_I2C_AbortCpltCallback(I2C_HandleTypeDef *hi2c){
i2cDev.CpltCallback();
}
void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c) {
i2cDev.CpltCallback();
} }