tiendungkct
24-02-2009, 10:36 PM
em đọc TUT của anh Nam về giao tiếp i2c. em làm lại dùng 2 con dspic 30f2010 giao tiếp với nhau .code master em chỉ chỉnh 1 chút ,slave em viết ,nhưng không hỉu sao nó không chạy ji hết.
Master em gửi dữ kiệu xuống ,slave nhận và xuất ra port B em dùng ngắt để nhạn dữ liệu của master trong ngắt em bật led nối vào portE0 để kiểm tra nhưng cũng không thấy xẩy ra ngắt luôn .Mong các bác giúp đỡ em nhé.thanks
Mater
#include "p30f2010.h"
_FOSC(CSW_FSCM_OFF & XT_PLL4); //clock 32MHZ
_FWDT(WDT_OFF);
_FBORPOR(PBOR_OFF & MCLR_EN);
_FGS(CODE_PROT_OFF);
#define Fcy 8000000 //Tan so thuc thi lenh
#define baud 100000 //Toc do baud cua giao tiep I2C
void Init_PORT(void);
void Init_I2C(void);
void Write_I2C(unsigned char);
unsigned char Read_I2C(void);
void Wait_I2C(void);
void I2C_Fail(void);
int main(void) {
Init_PORT(); //Khoi tao cac cong I/O
Init_I2C(); //Khoi tao module I2C
while (1)
{
// b1 start
_SEN =1 ;
Wait_I2C();
// gui dia chi
Write_I2C(0xA0);
if (_ACKSTAT) I2C_Fail();
//gui data
Write_I2C(0x02);
if (_ACKSTAT) I2C_Fail();
Write_I2C(0x03);
if (_ACKSTAT) I2C_Fail();
// gui stop
_PEN=1;
Wait_I2C();
LATEbits.LATE0=1; // bao hieu xong
}
}
void Init_PORT()
{
LATB=0x00;// port B OutPut
TRISB=0x00;
LATE=0x00;// port B OutPut
TRISE=0x00;
}
void Init_I2C()
{
I2CCON=0x8200;//I2c che do 7 bit tat slew rate
I2CBRG = (((Fcy/baud) - (Fcy/1111111))-1);//toc do boaud cho I2C
}
void Write_I2C(unsigned char d) {
I2CTRN = d;
Wait_I2C();
}
void Wait_I2C()
{
while (!_MI2CIF)
_MI2CIF =0;
}
void I2C_Fail(void)
{
_PEN = 1; //Tao ra dieu kien STOP
Wait_I2C(); //Cho hoat dong I2C hoan tat
LATB = 0x000F; //Bat LED noi vao port b de bao loi
while (1); //Dung chuong trinh tai day
}
unsigned char Read_I2C(void) {
unsigned char d;
_RCEN = 1; //Cho phep nhan byte
Wait_I2C(); //Cho hoat dong I2C hoan tat
d = I2CRCV; //Lay byte da nhan dat vao d
if (_ACKSTAT) _ACKDT = 1; //Neu NACK thi bat ACKDT
else _ACKDT = 0; //Nguoc lai thi tat ACKDT
_ACKEN = 1; //Ghi bit ACK/NACK ra I2C bus
Wait_I2C(); //Cho hoat dong I2C hoan tat
return d; //Tra byte da doc ve chuong trinh goi
}
Slave
#include "p30f2010.h"
//slave
_FOSC(CSW_FSCM_OFF & XT_PLL4);
_FWDT(WDT_OFF);
_FBORPOR(PBOR_OFF & MCLR_EN);
_FGS(CODE_PROT_OFF);
#define Fcy 8000000 //Tan so thuc thi lenh
#define baud 100000 //Toc do baud cua giao tiep I2C
#define _ISR_PSV __attribute__((interrupt, auto_psv))
#define ms_count 125
void Init_TMR1(void);
void Delay_ms(unsigned char);
void Init_PORT(void);
void Init_I2C (void);
unsigned char temp;
unsigned char buff[3];
unsigned short buff_idx;
int main(void)
{
Init_PORT();
Init_TMR1();
Init_I2C();
buff_idx=0;
while(1)
{
LATEbits.LATE1=1;
}
}
void Init_PORT(void)
{
LATB=0x00;
TRISB =0x00;// port B out
LATE=0x00;// port B Out Put
TRISE=0x00;
}
void Init_I2C(void)
{
I2CCON=0x9040;
I2CBRG = (((Fcy/baud) - (Fcy/1111111))-1);
I2CADD = 0xA0 ; // dia chi slave
_SI2CIF=0; // xoa co ngat I2C
_SI2CIE=1;// cho phep ngat I2C slave
}
void _ISR_PSV _SI2C1Interrupt(void)
{
unsigned char temp,i;
if (_R_W==0 && _D_A==0) // neu du lieu truyen vao la read +dia chi
{
temp=I2CRCV;// doc de giai phong bo dem
}
else if(_R_W==0 && _D_A==1)// neu data truyen vao la read+du lieu
{
temp=I2CRCV;// doc data luu vao buff[3]
buff[buff_idx++]=temp;
_STREN=1;
}
else if (_R_W==1 && _D_A==0)// neu du lieu nhan la write+dia chi
{
temp=I2CRCV;// doc giai phong bo dem
I2CTRN=buff[buff_idx++];
while(I2CSTATbits.TBF);//Wait till all
_STREN=1;
}
for (i=0 ;i<3;i++) // xuat data ra portb
{
LATB=buff[i];
Delay_ms(2);
}
LATEbits.LATE0=1; // bat led noi vao bitE0 de kiem tra x/r ngat
_SI2CIF = 0; // clear interrupt flag
}
void Init_TMR1(void)
{
TMR1=0;
PR1=ms_count;
T1CON=0x0030;//1:256
}
void Delay_ms(unsigned char n)
{
PR1 =n*ms_count ;
T1CONbits.TON=1;
while (_T1IF==1)
T1CONbits.TON=0;
_T1IF=0;
}
mong được sự giúp đỡ
Master em gửi dữ kiệu xuống ,slave nhận và xuất ra port B em dùng ngắt để nhạn dữ liệu của master trong ngắt em bật led nối vào portE0 để kiểm tra nhưng cũng không thấy xẩy ra ngắt luôn .Mong các bác giúp đỡ em nhé.thanks
Mater
#include "p30f2010.h"
_FOSC(CSW_FSCM_OFF & XT_PLL4); //clock 32MHZ
_FWDT(WDT_OFF);
_FBORPOR(PBOR_OFF & MCLR_EN);
_FGS(CODE_PROT_OFF);
#define Fcy 8000000 //Tan so thuc thi lenh
#define baud 100000 //Toc do baud cua giao tiep I2C
void Init_PORT(void);
void Init_I2C(void);
void Write_I2C(unsigned char);
unsigned char Read_I2C(void);
void Wait_I2C(void);
void I2C_Fail(void);
int main(void) {
Init_PORT(); //Khoi tao cac cong I/O
Init_I2C(); //Khoi tao module I2C
while (1)
{
// b1 start
_SEN =1 ;
Wait_I2C();
// gui dia chi
Write_I2C(0xA0);
if (_ACKSTAT) I2C_Fail();
//gui data
Write_I2C(0x02);
if (_ACKSTAT) I2C_Fail();
Write_I2C(0x03);
if (_ACKSTAT) I2C_Fail();
// gui stop
_PEN=1;
Wait_I2C();
LATEbits.LATE0=1; // bao hieu xong
}
}
void Init_PORT()
{
LATB=0x00;// port B OutPut
TRISB=0x00;
LATE=0x00;// port B OutPut
TRISE=0x00;
}
void Init_I2C()
{
I2CCON=0x8200;//I2c che do 7 bit tat slew rate
I2CBRG = (((Fcy/baud) - (Fcy/1111111))-1);//toc do boaud cho I2C
}
void Write_I2C(unsigned char d) {
I2CTRN = d;
Wait_I2C();
}
void Wait_I2C()
{
while (!_MI2CIF)
_MI2CIF =0;
}
void I2C_Fail(void)
{
_PEN = 1; //Tao ra dieu kien STOP
Wait_I2C(); //Cho hoat dong I2C hoan tat
LATB = 0x000F; //Bat LED noi vao port b de bao loi
while (1); //Dung chuong trinh tai day
}
unsigned char Read_I2C(void) {
unsigned char d;
_RCEN = 1; //Cho phep nhan byte
Wait_I2C(); //Cho hoat dong I2C hoan tat
d = I2CRCV; //Lay byte da nhan dat vao d
if (_ACKSTAT) _ACKDT = 1; //Neu NACK thi bat ACKDT
else _ACKDT = 0; //Nguoc lai thi tat ACKDT
_ACKEN = 1; //Ghi bit ACK/NACK ra I2C bus
Wait_I2C(); //Cho hoat dong I2C hoan tat
return d; //Tra byte da doc ve chuong trinh goi
}
Slave
#include "p30f2010.h"
//slave
_FOSC(CSW_FSCM_OFF & XT_PLL4);
_FWDT(WDT_OFF);
_FBORPOR(PBOR_OFF & MCLR_EN);
_FGS(CODE_PROT_OFF);
#define Fcy 8000000 //Tan so thuc thi lenh
#define baud 100000 //Toc do baud cua giao tiep I2C
#define _ISR_PSV __attribute__((interrupt, auto_psv))
#define ms_count 125
void Init_TMR1(void);
void Delay_ms(unsigned char);
void Init_PORT(void);
void Init_I2C (void);
unsigned char temp;
unsigned char buff[3];
unsigned short buff_idx;
int main(void)
{
Init_PORT();
Init_TMR1();
Init_I2C();
buff_idx=0;
while(1)
{
LATEbits.LATE1=1;
}
}
void Init_PORT(void)
{
LATB=0x00;
TRISB =0x00;// port B out
LATE=0x00;// port B Out Put
TRISE=0x00;
}
void Init_I2C(void)
{
I2CCON=0x9040;
I2CBRG = (((Fcy/baud) - (Fcy/1111111))-1);
I2CADD = 0xA0 ; // dia chi slave
_SI2CIF=0; // xoa co ngat I2C
_SI2CIE=1;// cho phep ngat I2C slave
}
void _ISR_PSV _SI2C1Interrupt(void)
{
unsigned char temp,i;
if (_R_W==0 && _D_A==0) // neu du lieu truyen vao la read +dia chi
{
temp=I2CRCV;// doc de giai phong bo dem
}
else if(_R_W==0 && _D_A==1)// neu data truyen vao la read+du lieu
{
temp=I2CRCV;// doc data luu vao buff[3]
buff[buff_idx++]=temp;
_STREN=1;
}
else if (_R_W==1 && _D_A==0)// neu du lieu nhan la write+dia chi
{
temp=I2CRCV;// doc giai phong bo dem
I2CTRN=buff[buff_idx++];
while(I2CSTATbits.TBF);//Wait till all
_STREN=1;
}
for (i=0 ;i<3;i++) // xuat data ra portb
{
LATB=buff[i];
Delay_ms(2);
}
LATEbits.LATE0=1; // bat led noi vao bitE0 de kiem tra x/r ngat
_SI2CIF = 0; // clear interrupt flag
}
void Init_TMR1(void)
{
TMR1=0;
PR1=ms_count;
T1CON=0x0030;//1:256
}
void Delay_ms(unsigned char n)
{
PR1 =n*ms_count ;
T1CONbits.TON=1;
while (_T1IF==1)
T1CONbits.TON=0;
_T1IF=0;
}
mong được sự giúp đỡ