|
|
View previous topic :: View next topic |
Author |
Message |
natan
Joined: 08 Oct 2009 Posts: 3
|
PIC24 I2C Read System Freeze |
Posted: Thu Oct 08, 2009 8:35 am |
|
|
I am using a PIC24FJ16GA002. For my I2C communication I am using pins 17 and 18 (I2C1). I have tried using SW mode and it gives me incorrect I2C timing, the clock transitions appear at the same time as data transitions. But no hangs occur. When I attempt to use HW mode my timing works well with the transitions on both lines where they are supposed to be. But in this mode I hang after my first read command. After this hang I can not simply reset the pic I have to physically disconnect my ICD3 from my usb and reconnect it. I am using MPLAB.
Code: | #rom 0x2BFC = {0x79C7}
#rom 0x2BFE = {0x321F}
#use I2C(I2C1, MASTER, SLOW, FORCE_HW)
#pin_select IC1=PIN_B0
unsigned int8 X, Y = 0;
void main()
{
setup_oscillator( OSC_INTERNAL, 32000000);
setup_timer2(TMR_INTERNAL | TMR_DIV_BY_1);
setup_timer4(TMR_INTERNAL | TMR_DIV_BY_1);
setup_timer3(TMR_INTERNAL | TMR_DIV_BY_1);
setup_timer5(TMR_INTERNAL | TMR_DIV_BY_1);
setup_spi(SPI_SS_DISABLED);
setup_spi2(SPI_SS_DISABLED);
setup_wdt(WDT_ON);
setup_timer1(TMR_INTERNAL|TMR_DIV_BY_1);
while(1){
X = 0x10;
// Write value
i2c_start();
i2c_write(0X58); // I2C Address with read bit
i2c_write(1); // Memory Address
i2c_write(X); // Value to write
i2c_stop();
delay_us(10);
// Read Value
i2c_start();
i2c_write(0X59); // I2C Address with write bit
Y = i2c_read(); // Read last memory written
i2c_stop();
delay_us(1000);
}
} |
|
|
|
Ttelmah Guest
|
|
Posted: Thu Oct 08, 2009 9:26 am |
|
|
Er.
Check your addresses.
On I2C, the R/W bit is the bottom bit of the address, and is 'high' for a read. You have 0x58, commented as a 'read' address. This cannot be.
You appear to have your read, and write addresses reversed.....
The bottom bit, is R/!W.
High for a read, low for a Write.
Since you are trying to read, when the slave expects a write, it is not surprising you hang...
Best Wishes |
|
|
natan
Joined: 08 Oct 2009 Posts: 3
|
|
Posted: Thu Oct 08, 2009 9:36 am |
|
|
Sorry about that I put my commenting in last minute to make it easier for the people on the forum to help be find the bug. My commenting is wrong but you will notice my usage case is correct. I am using 0x58 before my writes and 0x59 before my read command. Here is the code with the correct comments.
Code: | #rom 0x2BFC = {0x79C7}
#rom 0x2BFE = {0x321F}
#use I2C(I2C1, MASTER, SLOW, FORCE_HW)
#pin_select IC1=PIN_B0
unsigned int8 X, Y = 0;
void main()
{
setup_oscillator( OSC_INTERNAL, 32000000);
setup_timer2(TMR_INTERNAL | TMR_DIV_BY_1);
setup_timer4(TMR_INTERNAL | TMR_DIV_BY_1);
setup_timer3(TMR_INTERNAL | TMR_DIV_BY_1);
setup_timer5(TMR_INTERNAL | TMR_DIV_BY_1);
setup_spi(SPI_SS_DISABLED);
setup_spi2(SPI_SS_DISABLED);
setup_wdt(WDT_ON);
setup_timer1(TMR_INTERNAL|TMR_DIV_BY_1);
while(1){
X = 0x10;
// Write value
i2c_start();
i2c_write(0X58); // I2C Address with write bit
i2c_write(1); // Memory Address
i2c_write(X); // Value to write
i2c_stop();
delay_us(10);
// Read Value
i2c_start();
i2c_write(0X59); // I2C Address with read bit
Y = i2c_read(); // Read last memory written
i2c_stop();
delay_us(1000);
}
} |
|
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|