|
Tài trợ cho PIC Vietnam |
dsPIC - Bộ điều khiển tín hiệu số 16-bit Theo dự kiến của Microchip, vào khoảng năm 2011 dsPIC sẽ có doanh số lớn hơn PIC |
|
Ðiều Chỉnh | Xếp Bài |
24-02-2009, 10:36 PM | #1 |
Đệ tử 4 túi
Tham gia ngày: May 2007
Bài gửi: 69
: |
Giao tiếp 2 dspic bằng I2C
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 Code:
#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 } Code:
#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; } thay đổi nội dung bởi: tiendungkct, 24-02-2009 lúc 10:42 PM. |
|
|