|
|
View previous topic :: View next topic |
Author |
Message |
rudy
Joined: 27 Apr 2008 Posts: 167
|
i2c over 16F877A doesn't work |
Posted: Tue Feb 16, 2010 6:58 am |
|
|
Hi everybody;
Trying to use I2C over 16F877A @ 20Mhz, but it simple doesn't work at all.
Here is my code:
Code: | #include <16f877a.h>
#fuses HS,PUT,WDT,PROTECT,NOBROWNOUT,NOLVP,CPD
#use delay(clock=20000000, RESTART_WDT)
#use i2c(MASTER, SDA=PIN_C4, SCL=PIN_C3)
#define SLAVE1 0x10
#define SLAVE2 0x20
.
.
.
.
void i2c_send()
{
i2c_start();
i2c_write(SLAVE1);
i2c_write(0X00);
i2c_write(0X01);
i2c_stop();
deb=1;
}
|
I already take a look at .lst file, and didn’t see any register associated with I2C. What’s going wrong? |
|
|
Ttelmah Guest
|
|
Posted: Tue Feb 16, 2010 7:45 am |
|
|
Unless you comment out the #nolist line, near the top of the processor include file, No assembly will be generated in the list file, for the 'internal' CCS functions, so nothing would be shown accessing the I2C peripheral, if you were doing so.
However, as shown you are not using the I2C peripheral, but software functions. You need to add 'FORCE_HW' to the I2C declaration to use the hardware peripheral. Note the line in the manual:
"Software functions are generated unless the FORCE_HW is specified".
Not working, number of things:
1) Have you got suitable pull-up resistors on the lines?.
2) What is the peripheral chip?.
Best Wishes |
|
|
rudy
Joined: 27 Apr 2008 Posts: 167
|
|
Posted: Tue Feb 16, 2010 9:08 am |
|
|
Thanks Sr.
It’s working now. Just to the records, the peripheral chips are two more 16F877A.
Now, I ask you how do the slaves talk to the MASTER? Is only a matter of change TRISC directions and disable SSP interruption while transmit? Right now I got perfect conversation, but only MASTER to SLAVE direction, and I will, for sure, need to receive some "WORDS" from THE SLAVES. |
|
|
Ttelmah Guest
|
|
Posted: Tue Feb 16, 2010 9:32 am |
|
|
Look at the examples. EX_slave.c, shows how to do this. You don't change anything, except the 'direction' bit at the bottom of the slave address, written by the master. So the master writes to the slave, saying 'I want to read', by setting this bit, and the slave then writes the required byte(s) into the I2C buffer. The master then reads, and receives this.
Best Wishes |
|
|
rudy
Joined: 27 Apr 2008 Posts: 167
|
|
Posted: Wed Feb 17, 2010 3:46 pm |
|
|
Hi.
I really tried a lot to receive some "words" from my slave, but it seems to me a little bit confuse.
Can anyone "translate" to me what exactly each line of the below code means?
Code: |
#INT_SSP
void i2c_isr()
{
state = i2c_isr_state();
if((state == 0 ) || (state == 0x80)) i2c_read();
if(state >= 0x80) i2c_write(send_buffer[state - 0x80]);
else if(state > 0) rcv_buffer[state - 1] = i2c_read();
}
|
The communication flow normally from master to slave.
I didn’t realize when may I send data for the master, can anybody help me? |
|
|
|
|
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
|