I’ve been integrating the first SDCC implementation of an I2C Master module with my current EE project and the results are positive. While this is but a small piece of a much larger puzzle, I’m pleased that I’ve been able to hit the ground running with this compiler. The C implementation is much shorter that the previous assembly language program… and easier to read. Below is the majority of the transaction with the master first sending a “stop ranging” command to the slave, followed by a write requesting the most recent range information. The last half of the transaction is the master read of two bytes of range data in MSB format.
The corrisponding C code is just this simple:
//Enable range sensor and wait i2cMasterStart(5); buffer[0] = EnableSensor; result = i2cMasterWrite(RangeSensorA, (char*)&buffer, 1, 10); i2cMasterStop(5); //Measure range for 0.5 seconds at 8MHz delay1mtcy(1); if(result == _I2C_OK) { //Disable range sensor buffer[0] = DisableSensor; i2cMasterStart(5); result = i2cMasterWrite(RangeSensorA, (char*)&buffer, 1, 10); i2cMasterStop(5); if(result == _I2C_OK) { //Get range i2cMasterStart(5); buffer[0] = GetLatestRange; result = i2cMasterWrite(RangeSensorA, (char*)&buffer, 1, 10); if(result == _I2C_OK) { i2cMasterRepeatedStart(10); result = i2cMasterRead(RangeSensorA, (char*)&buffer, 2, 20); } //write result ok i2cMasterStop(5); } } delay1ktcy(100);