Simplify parameters and cleanup
This commit is contained in:
parent
1d341a7aeb
commit
81a36dc31e
|
@ -8,19 +8,20 @@ using namespace Pinetime::Drivers;
|
||||||
// TODO use shortcut to automatically send STOP when receive LastTX, for example
|
// TODO use shortcut to automatically send STOP when receive LastTX, for example
|
||||||
// TODO use DMA/IRQ
|
// TODO use DMA/IRQ
|
||||||
|
|
||||||
TwiMaster::TwiMaster(const Modules module, const Parameters& params) : module {module}, params {params} {
|
TwiMaster::TwiMaster(NRF_TWIM_Type* module, uint32_t frequency, uint8_t pinSda, uint8_t pinScl)
|
||||||
|
: module {module}, frequency {frequency}, pinSda {pinSda}, pinScl {pinScl} {
|
||||||
mutex = xSemaphoreCreateBinary();
|
mutex = xSemaphoreCreateBinary();
|
||||||
}
|
}
|
||||||
|
|
||||||
void TwiMaster::ConfigurePins() const {
|
void TwiMaster::ConfigurePins() const {
|
||||||
NRF_GPIO->PIN_CNF[params.pinScl] =
|
NRF_GPIO->PIN_CNF[pinScl] =
|
||||||
(GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos) |
|
(GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos) |
|
||||||
(GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) |
|
(GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) |
|
||||||
(GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) |
|
(GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) |
|
||||||
(GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos) |
|
(GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos) |
|
||||||
(GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos);
|
(GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos);
|
||||||
|
|
||||||
NRF_GPIO->PIN_CNF[params.pinSda] =
|
NRF_GPIO->PIN_CNF[pinSda] =
|
||||||
(GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos) |
|
(GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos) |
|
||||||
(GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) |
|
(GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) |
|
||||||
(GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) |
|
(GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) |
|
||||||
|
@ -31,28 +32,12 @@ void TwiMaster::ConfigurePins() const {
|
||||||
void TwiMaster::Init() {
|
void TwiMaster::Init() {
|
||||||
ConfigurePins();
|
ConfigurePins();
|
||||||
|
|
||||||
switch (module) {
|
twiBaseAddress = module;
|
||||||
case Modules::TWIM1:
|
|
||||||
twiBaseAddress = NRF_TWIM1;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (static_cast<Frequencies>(params.frequency)) {
|
twiBaseAddress->FREQUENCY = frequency;
|
||||||
case Frequencies::Khz100:
|
|
||||||
twiBaseAddress->FREQUENCY = TWIM_FREQUENCY_FREQUENCY_K100;
|
|
||||||
break;
|
|
||||||
case Frequencies::Khz250:
|
|
||||||
twiBaseAddress->FREQUENCY = TWIM_FREQUENCY_FREQUENCY_K250;
|
|
||||||
break;
|
|
||||||
case Frequencies::Khz400:
|
|
||||||
twiBaseAddress->FREQUENCY = TWIM_FREQUENCY_FREQUENCY_K400;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
twiBaseAddress->PSEL.SCL = params.pinScl;
|
twiBaseAddress->PSEL.SCL = pinScl;
|
||||||
twiBaseAddress->PSEL.SDA = params.pinSda;
|
twiBaseAddress->PSEL.SDA = pinSda;
|
||||||
twiBaseAddress->EVENTS_LASTRX = 0;
|
twiBaseAddress->EVENTS_LASTRX = 0;
|
||||||
twiBaseAddress->EVENTS_STOPPED = 0;
|
twiBaseAddress->EVENTS_STOPPED = 0;
|
||||||
twiBaseAddress->EVENTS_LASTTX = 0;
|
twiBaseAddress->EVENTS_LASTTX = 0;
|
||||||
|
@ -63,12 +48,6 @@ void TwiMaster::Init() {
|
||||||
|
|
||||||
twiBaseAddress->ENABLE = (TWIM_ENABLE_ENABLE_Enabled << TWIM_ENABLE_ENABLE_Pos);
|
twiBaseAddress->ENABLE = (TWIM_ENABLE_ENABLE_Enabled << TWIM_ENABLE_ENABLE_Pos);
|
||||||
|
|
||||||
/* // IRQ
|
|
||||||
NVIC_ClearPendingIRQ(_IRQn);
|
|
||||||
NVIC_SetPriority(_IRQn, 2);
|
|
||||||
NVIC_EnableIRQ(_IRQn);
|
|
||||||
*/
|
|
||||||
|
|
||||||
xSemaphoreGive(mutex);
|
xSemaphoreGive(mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -194,12 +173,10 @@ void TwiMaster::Wakeup() {
|
||||||
* */
|
* */
|
||||||
void TwiMaster::FixHwFreezed() {
|
void TwiMaster::FixHwFreezed() {
|
||||||
NRF_LOG_INFO("I2C device frozen, reinitializing it!");
|
NRF_LOG_INFO("I2C device frozen, reinitializing it!");
|
||||||
// Disable I²C
|
|
||||||
uint32_t twi_state = NRF_TWI1->ENABLE;
|
uint32_t twi_state = NRF_TWI1->ENABLE;
|
||||||
twiBaseAddress->ENABLE = TWIM_ENABLE_ENABLE_Disabled << TWI_ENABLE_ENABLE_Pos;
|
|
||||||
|
|
||||||
ConfigurePins();
|
Sleep();
|
||||||
|
|
||||||
// Re-enable I²C
|
|
||||||
twiBaseAddress->ENABLE = twi_state;
|
twiBaseAddress->ENABLE = twi_state;
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,16 +8,9 @@ namespace Pinetime {
|
||||||
namespace Drivers {
|
namespace Drivers {
|
||||||
class TwiMaster {
|
class TwiMaster {
|
||||||
public:
|
public:
|
||||||
enum class Modules { TWIM1 };
|
|
||||||
enum class Frequencies { Khz100, Khz250, Khz400 };
|
|
||||||
enum class ErrorCodes { NoError, TransactionFailed };
|
enum class ErrorCodes { NoError, TransactionFailed };
|
||||||
struct Parameters {
|
|
||||||
uint32_t frequency;
|
|
||||||
uint8_t pinSda;
|
|
||||||
uint8_t pinScl;
|
|
||||||
};
|
|
||||||
|
|
||||||
TwiMaster(const Modules module, const Parameters& params);
|
TwiMaster(NRF_TWIM_Type* module, uint32_t frequency, uint8_t pinSda, uint8_t pinScl);
|
||||||
|
|
||||||
void Init();
|
void Init();
|
||||||
ErrorCodes Read(uint8_t deviceAddress, uint8_t registerAddress, uint8_t* buffer, size_t size);
|
ErrorCodes Read(uint8_t deviceAddress, uint8_t registerAddress, uint8_t* buffer, size_t size);
|
||||||
|
@ -26,16 +19,18 @@ namespace Pinetime {
|
||||||
void Sleep();
|
void Sleep();
|
||||||
void Wakeup();
|
void Wakeup();
|
||||||
|
|
||||||
void ConfigurePins() const;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ErrorCodes Read(uint8_t deviceAddress, uint8_t* buffer, size_t size, bool stop);
|
ErrorCodes Read(uint8_t deviceAddress, uint8_t* buffer, size_t size, bool stop);
|
||||||
ErrorCodes Write(uint8_t deviceAddress, const uint8_t* data, size_t size, bool stop);
|
ErrorCodes Write(uint8_t deviceAddress, const uint8_t* data, size_t size, bool stop);
|
||||||
void FixHwFreezed();
|
void FixHwFreezed();
|
||||||
|
void ConfigurePins() const;
|
||||||
|
|
||||||
NRF_TWIM_Type* twiBaseAddress;
|
NRF_TWIM_Type* twiBaseAddress;
|
||||||
SemaphoreHandle_t mutex = nullptr;
|
SemaphoreHandle_t mutex = nullptr;
|
||||||
const Modules module;
|
NRF_TWIM_Type* module;
|
||||||
const Parameters params;
|
uint32_t frequency;
|
||||||
|
uint8_t pinSda;
|
||||||
|
uint8_t pinScl;
|
||||||
static constexpr uint8_t maxDataSize {16};
|
static constexpr uint8_t maxDataSize {16};
|
||||||
static constexpr uint8_t registerSize {1};
|
static constexpr uint8_t registerSize {1};
|
||||||
uint8_t internalBuffer[maxDataSize + registerSize];
|
uint8_t internalBuffer[maxDataSize + registerSize];
|
||||||
|
|
|
@ -81,9 +81,8 @@ Pinetime::Drivers::SpiNorFlash spiNorFlash {flashSpi};
|
||||||
// The TWI device should work @ up to 400Khz but there is a HW bug which prevent it from
|
// The TWI device should work @ up to 400Khz but there is a HW bug which prevent it from
|
||||||
// respecting correct timings. According to erratas heet, this magic value makes it run
|
// respecting correct timings. According to erratas heet, this magic value makes it run
|
||||||
// at ~390Khz with correct timings.
|
// at ~390Khz with correct timings.
|
||||||
static constexpr uint32_t MaxTwiFrequencyWithoutHardwareBug {0x06200000};
|
//static constexpr uint32_t MaxTwiFrequencyWithoutHardwareBug {0x06200000};
|
||||||
Pinetime::Drivers::TwiMaster twiMaster {Pinetime::Drivers::TwiMaster::Modules::TWIM1,
|
Pinetime::Drivers::TwiMaster twiMaster {NRF_TWIM1, TWI_FREQUENCY_FREQUENCY_K250, pinTwiSda, pinTwiScl};
|
||||||
Pinetime::Drivers::TwiMaster::Parameters {MaxTwiFrequencyWithoutHardwareBug, pinTwiSda, pinTwiScl}};
|
|
||||||
Pinetime::Drivers::Cst816S touchPanel {twiMaster, touchPanelTwiAddress};
|
Pinetime::Drivers::Cst816S touchPanel {twiMaster, touchPanelTwiAddress};
|
||||||
#ifdef PINETIME_IS_RECOVERY
|
#ifdef PINETIME_IS_RECOVERY
|
||||||
static constexpr bool isFactory = true;
|
static constexpr bool isFactory = true;
|
||||||
|
|
Loading…
Reference in a new issue