2007-04-06 04:01 AM
2011-05-17 12:40 AM
Hello,
in the following code I use the I2C0 in IRQ mode. I have to read the temperature from a LM75 The device is adressed 0x91 (readmode) followed with 2 bytes. I analyzed the scl and sck line with the oscilloscope and the signal seem correct. The Temp sensor send a data but I always receive FF The port configuration reflect the following configuration: // **************************************************************** // GPIO input register setting // **************************************************************** #define GPIOIN2 0x41 // **************************************************************** // GPIO output register setting // **************************************************************** #define GPIOOUT2 0x8A5A // **************************************************************** // GPIO type register setting // **************************************************************** #define GPIOTYPE2 0x3 -------- the code -------- void main() { DeviceInit(); /* I2C0 Configuration */ I2C_Cmd(I2C0, ENABLE); SCU_APBPeriphClockConfig(__I2C0,ENABLE); I2C_DeInit(I2C0); SCU_AHBPeriphClockConfig(__VIC, ENABLE); VIC_DeInit(); /* I2C0 Configuration */ I2C_Struct.I2C_GeneralCall = I2C_GeneralCall_Disable; I2C_Struct.I2C_Ack = I2C_Ack_Enable; I2C_Struct.I2C_CLKSpeed = 20000; I2C_Init(I2C0, &I2C_Struct); /* VIC Configuration */ VIC_Config(I2C0_ITLine,VIC_IRQ , 1); VIC_ITCmd(I2C0_ITLine, ENABLE); I2C_ITConfig(I2C0, ENABLE); /*--------------------------------------------------*/ /* Reception Phase----------------------------------*/ /*--------------------------------------------------*/ /*reset counters*/ Tx_Idx = Rx_Idx = 0; Direction = I2C_MODE_RECEIVER; while(1) { Rx_Idx = 0; I2C_GenerateStart(I2C0, ENABLE); while (Rx_Idx < BUFFER_SIZE); /* Check if the transmitted data is read correctly */ Delay(100000); } while(1) { } } void I2C0_IRQHandler(void) { u16 event1 = I2C0->SR1; u16 event2 = I2C0->SR2; if ( event1 & 0x01 ) { // case I2C_EVENT_MASTER_MODE_SELECT: // EV5 I2C_Send7bitAddress(I2C0, I2C_SLAVE_ADDRESS7, Direction); } else if ( event2 & 0x20 ) { // case I2C_EVENT_MASTER_MODE_SELECTED: // EV6 // Clear EV6 by set again the PE bit I2C0->CR |= 0x20; if (Direction == I2C_MODE_TRANSMITTER) I2C_SendData(I2C0, I2C0_Buffer_Tx[Tx_Idx++]);//EV8 just after EV6 } else if ( (event1 & 0x08) && (Direction == I2C_MODE_TRANSMITTER) ) { // case I2C_EVENT_MASTER_BYTE_TRANSMITTED: // EV8 if ( Tx_Idx == BUFFER_SIZE ) { I2C_GenerateSTOP (I2C0, ENABLE); Tx_Idx++; } else { I2C_SendData(I2C0, I2C0_Buffer_Tx[Tx_Idx]); Tx_Idx++; } } else if ( event1 & 0x08 ) { // case I2C_EVENT_MASTER_BYTE_RECEIVED: // EV7 I2C0_Buffer_Rx[Rx_Idx++] = I2C_ReceiveData(I2C0); if ( Rx_Idx == BUFFER_SIZE-2 ) { I2C_AcknowledgeConfig (I2C0, DISABLE); } if ( Rx_Idx == BUFFER_SIZE-1 ) { /* Send STOP Condition */ I2C_GenerateSTOP(I2C0, ENABLE); } } } Any suggestion is appreciated!!2011-05-17 12:40 AM
I did look at your code but here is what I can suggest to you :
If you try read the DR register with a breakpoint, you will read FF but if you set your breakpoint after transfering the DR content to a variable, you will read the correct value. An other point, check to LM75 answer on the scope, if this is correct. Ensure that you did all the EVx step in order. Hope this will help2011-05-17 12:40 AM
Hi camelon,
I tryed to debug the sw in different ways, I didn't check the I2C0 register directly but I try to see the values stored in the buffer. In any case I just solved the problem in the following way: the initial configuration suggested to me using CAPS for the GPIOIN2 was 0x41 I enabled the pin 2.1 as alternate input 1 and the i2c0 now it's works. hoping this thing could help someone!