dung h
21-07-2009, 01:16 AM
mình đang tìm hiểu về giao tiếp i2c! mình viết chương trình gửi dữ liệu từ 1 mater là pic 16f877a xuống 1 slave nhưng mô phỏng o thấy gì hết????
code mater:
#include <16F877A.H>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use Delay(Clock=4000000)
#define SLAVE_ADDRESS 0x10
#use i2c(master, sda=PIN_C4, scl=PIN_C3)
void write_I2C(int8 a)
{
i2c_start();
i2c_write(SLAVE_ADDRESS);
i2c_write(a);
i2c_stop();
}
void main()
{
int8 value;
value = 0;
while(true){
write_I2C(value);
output_b(value);
value++;
delay_ms(100);
}
}
cho con slave:
#include <16F877A.H>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(Clock=4000000)
#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, address=0x10)
int8 value;
#INT_SSP
void i2c_isr()
{
int8 state;
int8 address;
state = i2c_isr_state();
if(state == 0)
address = i2c_read();
else if(state < 0x80)
value = i2c_read();
}
void main()
{
enable_interrupts(GLOBAL);
enable_interrupts(INT_SSP);
set_tris_b(0x00);
while(true){
output_b(value);
}
}
mình chửa hiểu lám 1 số lệnh trong ccs mong mọi người giúp:
state=i2c_isr_state() ; // trả về giá trị 8bit thông báo trang thái của i2c phảy o? hay gì
// mong giải thich cụ thể hơn
và giá trị state nhận được có y nghĩa như thế nào?
vd : state==0?????
state>0???
state<0x80???? // tại sao lại so sánh với 0x80??
state>0x80???
các thông số đó liên quan đến truyền ,nhận và bít ACK như thế nào?
khi nào mình biết mình nhận đủ 1 byte?
còn cả lệnh i2c_pull(); nữa???
mới học đọc các bài trên diễn đàn nhưng vẫn chưa ngộ ra!!!!mong được giúp đỡ!
thanks!
code mater:
#include <16F877A.H>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use Delay(Clock=4000000)
#define SLAVE_ADDRESS 0x10
#use i2c(master, sda=PIN_C4, scl=PIN_C3)
void write_I2C(int8 a)
{
i2c_start();
i2c_write(SLAVE_ADDRESS);
i2c_write(a);
i2c_stop();
}
void main()
{
int8 value;
value = 0;
while(true){
write_I2C(value);
output_b(value);
value++;
delay_ms(100);
}
}
cho con slave:
#include <16F877A.H>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(Clock=4000000)
#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, address=0x10)
int8 value;
#INT_SSP
void i2c_isr()
{
int8 state;
int8 address;
state = i2c_isr_state();
if(state == 0)
address = i2c_read();
else if(state < 0x80)
value = i2c_read();
}
void main()
{
enable_interrupts(GLOBAL);
enable_interrupts(INT_SSP);
set_tris_b(0x00);
while(true){
output_b(value);
}
}
mình chửa hiểu lám 1 số lệnh trong ccs mong mọi người giúp:
state=i2c_isr_state() ; // trả về giá trị 8bit thông báo trang thái của i2c phảy o? hay gì
// mong giải thich cụ thể hơn
và giá trị state nhận được có y nghĩa như thế nào?
vd : state==0?????
state>0???
state<0x80???? // tại sao lại so sánh với 0x80??
state>0x80???
các thông số đó liên quan đến truyền ,nhận và bít ACK như thế nào?
khi nào mình biết mình nhận đủ 1 byte?
còn cả lệnh i2c_pull(); nữa???
mới học đọc các bài trên diễn đàn nhưng vẫn chưa ngộ ra!!!!mong được giúp đỡ!
thanks!