I was creating a program to communicate with the compass
module(HMC5883L) using I2C module using Tiva C LaunchPad
(TM4C123GH6PM. When debugging, I found that, when a write value was
issued to the I2CMDR register, the value did not update in the
peripheral window of the debugger. I tried with alternate I2C modules
in the uC and in overall, I found that when using I2C1 module, I2C1
peripheral window in debug session, does not display any value at all
for I2C1 registers. While using rest of the I2C modules, I2CMDR value
in the I2C peripheral window didn't update at all(Sadly, it remained
the same 0x00!). I place my source rode here. Please anyone offer
suggestions. It is little urgent...!
I2C2 initialisation code
void initializeI2C( uint16_t i2cspeed, uint8_t slaveAddress)
SYSCTL_RCGCI2C_R |= 0X4; //Enable I2C clock
delay = SYSCTL_RCGCI2C_R; //create delay for clock stabilisation
SYSCTL_RCGC2_R |= 0x00000010; // activate clock for Port A
delay = SYSCTL_RCGC2_R; //create delay for clock stabilisation
GPIO_PORTE_LOCK_R = 0x4C4F434B; // unlock GPIO Port A
GPIO_PORTE_CR_R = 0xFF; // allow changes to PF7-0
GPIO_PORTE_AFSEL_R |= (1 << 4)|(1 << 5);//Alternate function assignment to respective pins
GPIO_PORTE_ODR_R |= (1 << 5) ; //Make I2CSDA pin for open drain configuration
GPIO_PORTE_PCTL_R |= 0x00330000; //Set corresponding PMCx reg. for I2C2 peripheral
I2C2_MCR_R |= 0 << MFE | 0 << SFE; //Initialise I2C as master
I2C2_MTPR_R |= ((16000/(20*i2cspeed)) - 1) << 0 | 0 << 7; //set the desired clock speed for SCL
I2C2_MSA_R = (slaveAddress << 1); //Specify the slave address for the operation
Here is the main code for writing to the I2CMDR register (I2C2
I2C2_MDR_R = 0x25;
The code compiled without any errors and I ran through every code
in the debugger, there was no problem at all, except this one.
Hi did you figure out what the problem was? I too have similar
problem with the I2CMDR register not getting updated.
Let me know please.
Has anyone figured this issue out? I am using TivaWare on a TM4C129 and if i step through (I realize the bus won't actually work due to timing issues with this approach) i never see updates to either the MDR or the MCLKOCNT registers. I checked the memory map against the macro expansion and the register address looks right and the data is present within the API function but it just never updates the register.
Specifically, regarding the I2CMDR, you may read 0x00, as "reading" this register might return the last data returned by the addressed device. As there was no data received yet, it reads 0x00. And the data to send is no longer visible. You should check with the device manufacturer regarding the function of this register, if the device manual does not help.