Skip to content

Wire: fix setClock #46

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Aug 10, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
111 changes: 60 additions & 51 deletions libraries/Wire/Wire.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -184,13 +184,12 @@ void TwoWire::WireSlaveCallback(i2c_slave_callback_args_t *arg) {


/* -------------------------------------------------------------------------- */
TwoWire::TwoWire(int scl, int sda, WireSpeed_t wp /*= SPEED_STANDARD*/, WireAddressMode_t am /*= ADDRESS_MODE_7_BITS*/, bool prefer_sci /*= false*/) :
TwoWire::TwoWire(int scl, int sda, WireAddressMode_t am /*= ADDRESS_MODE_7_BITS*/, bool prefer_sci /*= false*/) :
scl_pin(scl),
sda_pin(sda),
init_ok(false),
is_master(true),
is_sci(false),
speed_mode(wp),
address_mode(am),
timeout(1000),
transmission_begun(false),
Expand Down Expand Up @@ -281,11 +280,14 @@ void TwoWire::begin(void) {
init_ok &= cfg_pins(max_index);

if(init_ok) {

/* -----------------------------------
->>>>> MASTER initialization
* ----------------------------------- */
if(is_master) {

setClock(I2C_MASTER_RATE_STANDARD);

if(is_sci) {
TwoWire::g_SCIWires[channel] = this;

Expand Down Expand Up @@ -315,40 +317,21 @@ void TwoWire::begin(void) {

m_i2c_cfg.p_extend = &m_i2c_extend;
m_i2c_cfg.p_callback = WireMasterCallback;
}

m_sci_i2c_extend.clock_settings.clk_divisor_value = 0;
m_sci_i2c_extend.clock_settings.brr_value = 14;
m_sci_i2c_extend.clock_settings.mddr_value = 255;
m_sci_i2c_extend.clock_settings.bitrate_modulation = false;
m_sci_i2c_extend.clock_settings.cycles_value = 15;
m_sci_i2c_extend.clock_settings.snfr_value = (1);


/* Actual calculated bitrate: 99272. Actual calculated duty cycle: 49%. */
m_i2c_extend.timeout_mode = IIC_MASTER_TIMEOUT_MODE_SHORT;
m_i2c_extend.timeout_scl_low = IIC_MASTER_TIMEOUT_SCL_LOW_DISABLED;
m_i2c_extend.clock_settings.brl_value = 27;
m_i2c_extend.clock_settings.brh_value = 26;
m_i2c_extend.clock_settings.cks_value = 2;
m_i2c_extend.timeout_mode = IIC_MASTER_TIMEOUT_MODE_SHORT;
m_i2c_extend.timeout_scl_low = IIC_MASTER_TIMEOUT_SCL_LOW_DISABLED;
}

m_i2c_cfg.channel = channel;
m_i2c_cfg.rate = I2C_MASTER_RATE_STANDARD;
if(speed_mode == SPEED_FAST) {
m_i2c_cfg.rate = I2C_MASTER_RATE_FAST;
}
else if(speed_mode == SPEED_VERY_FAST) {
m_i2c_cfg.rate = I2C_MASTER_RATE_FASTPLUS;
}
m_i2c_cfg.slave = 0x00;
m_i2c_cfg.addr_mode = (address_mode == ADDRESS_MODE_7_BITS) ? I2C_MASTER_ADDR_MODE_7BIT : I2C_MASTER_ADDR_MODE_10BIT;
m_i2c_cfg.p_transfer_tx = NULL;
m_i2c_cfg.p_transfer_rx = NULL;

m_i2c_cfg.p_context = &m_i2c_cfg;
m_i2c_cfg.ipl = (12);



} // if(is_master) {
/* -----------------------------------
->>>>> SLAVE initialization
Expand All @@ -369,12 +352,6 @@ void TwoWire::begin(void) {

s_i2c_cfg.channel = channel;
s_i2c_cfg.rate = I2C_SLAVE_RATE_STANDARD;
if(speed_mode == SPEED_FAST) {
s_i2c_cfg.rate = I2C_SLAVE_RATE_FAST;
}
else if(speed_mode == SPEED_VERY_FAST) {
s_i2c_cfg.rate = I2C_SLAVE_RATE_FASTPLUS;
}
s_i2c_cfg.slave = slave_address;
s_i2c_cfg.addr_mode = (address_mode == ADDRESS_MODE_7_BITS) ? I2C_SLAVE_ADDR_MODE_7BIT : I2C_SLAVE_ADDR_MODE_10BIT;
s_i2c_cfg.general_call_enable = false;
Expand Down Expand Up @@ -483,13 +460,13 @@ uint8_t TwoWire::read_from(uint8_t address, uint8_t* data, uint8_t length, unsig
}
if(err == FSP_SUCCESS) {
if(m_read != nullptr) {
bus_status = WIRE_STATUS_UNSET;
err = m_read(&m_i2c_ctrl,data,length,!sendStop);
}
}
bus_status = WIRE_STATUS_UNSET;
while(timeout_ms > 0 && bus_status == WIRE_STATUS_UNSET) {
timeout_ms--;
delay(1);
timeout_ms = millis() + timeout_ms;
while(millis() < timeout_ms && bus_status == WIRE_STATUS_UNSET && err == FSP_SUCCESS) {

}
}

Expand All @@ -511,13 +488,13 @@ uint8_t TwoWire::write_to(uint8_t address, uint8_t* data, uint8_t length, unsign
}
if(err == FSP_SUCCESS) {
if(m_write != nullptr) {
bus_status = WIRE_STATUS_UNSET;
err = m_write(&m_i2c_ctrl,data,length,!sendStop);
}
}
bus_status = WIRE_STATUS_UNSET;
while(err == FSP_SUCCESS && timeout_ms > 0 && bus_status == WIRE_STATUS_UNSET) {
timeout_ms--;
delay(1);
timeout_ms = millis() + timeout_ms;
while(millis() < timeout_ms && bus_status == WIRE_STATUS_UNSET && err == FSP_SUCCESS) {

}

if(err != FSP_SUCCESS) {
Expand All @@ -544,7 +521,7 @@ uint8_t TwoWire::write_to(uint8_t address, uint8_t* data, uint8_t length, unsign
}

/* -------------------------------------------------------------------------- */
void TwoWire::setClock(uint32_t ws) {
void TwoWire::setClock(uint32_t freq) {
/* -------------------------------------------------------------------------- */
if(init_ok && is_master) {
if(m_close != nullptr) {
Expand All @@ -553,16 +530,48 @@ void TwoWire::setClock(uint32_t ws) {
}

if(is_master) {
if((WireSpeed_t)ws == SPEED_STANDARD) {
m_i2c_cfg.rate = I2C_MASTER_RATE_STANDARD;
}
else if((WireSpeed_t)ws == SPEED_FAST) {
m_i2c_cfg.rate = I2C_MASTER_RATE_FAST;
}
else if((WireSpeed_t)ws == SPEED_VERY_FAST) {
m_i2c_cfg.rate = I2C_MASTER_RATE_FASTPLUS;
}
m_i2c_cfg.rate = (i2c_master_rate_t)freq;

int clock_divisor = (R_FSP_SystemClockHzGet(BSP_FEATURE_SCI_CLOCK) / 48000000u) - 1;

if (is_sci) {
m_sci_i2c_extend.clock_settings.clk_divisor_value = 0;
m_sci_i2c_extend.clock_settings.cycles_value = 15;
m_sci_i2c_extend.clock_settings.snfr_value = (1);
switch (m_i2c_cfg.rate) {
case I2C_MASTER_RATE_STANDARD:
m_sci_i2c_extend.clock_settings.brr_value = 14;
m_sci_i2c_extend.clock_settings.mddr_value = 255;
m_sci_i2c_extend.clock_settings.bitrate_modulation = false;
break;
case I2C_MASTER_RATE_FAST:
default:
m_sci_i2c_extend.clock_settings.brr_value = 2;
m_sci_i2c_extend.clock_settings.mddr_value = 204;
m_sci_i2c_extend.clock_settings.bitrate_modulation = true;
break;
}
} else {
switch (m_i2c_cfg.rate) {
case I2C_MASTER_RATE_STANDARD:
m_i2c_extend.clock_settings.brl_value = 27;
m_i2c_extend.clock_settings.brh_value = 26;
m_i2c_extend.clock_settings.cks_value = 2 + clock_divisor;
break;
case I2C_MASTER_RATE_FAST:
m_i2c_extend.clock_settings.brl_value = 16;
m_i2c_extend.clock_settings.brh_value = 15;
m_i2c_extend.clock_settings.cks_value = 0 + clock_divisor;
break;
#if BSP_FEATURE_IIC_FAST_MODE_PLUS
case I2C_MASTER_RATE_FASTPLUS:
m_i2c_extend.clock_settings.brl_value = 6;
m_i2c_extend.clock_settings.brh_value = 5;
m_i2c_extend.clock_settings.cks_value = 0;
break;
#endif
}
}
}

if(init_ok) {
Expand Down
10 changes: 1 addition & 9 deletions libraries/Wire/Wire.h
Original file line number Diff line number Diff line change
Expand Up @@ -83,13 +83,6 @@ typedef enum {
ADDRESS_MODE_10_BITS
} WireAddressMode_t;

typedef enum {
SPEED_STANDARD = 0, //100 kHz
SPEED_FAST, //400 kHz
SPEED_VERY_FAST //1 Mhz
} WireSpeed_t;


typedef enum {
WIRE_STATUS_UNSET,
WIRE_STATUS_RX_COMPLETED,
Expand All @@ -103,7 +96,7 @@ typedef enum {
class TwoWire : public arduino::HardwareI2C {

public:
TwoWire(int scl_pin, int sda_pin, WireSpeed_t wp = SPEED_STANDARD, WireAddressMode_t am = ADDRESS_MODE_7_BITS, bool prefer_sci = false);
TwoWire(int scl_pin, int sda_pin, WireAddressMode_t am = ADDRESS_MODE_7_BITS, bool prefer_sci = false);
void begin();
void begin(uint8_t);
void begin(uint16_t);
Expand Down Expand Up @@ -172,7 +165,6 @@ class TwoWire : public arduino::HardwareI2C {
bool is_master;
int channel;
bool is_sci;
WireSpeed_t speed_mode;
WireAddressMode_t address_mode;

unsigned int timeout;
Expand Down