PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > dsPIC - Bộ điều khiển tín hiệu số 16-bit

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Tìm Kiếm Bài Trong Ngày Ðánh Dấu Ðã Ðọc Vi điều khiển

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
Prev Previous Post   Next Post Next
Old 24-02-2009, 10:36 PM   #1
tiendungkct
Đệ 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
}
Slave
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;
}
mong được sự giúp đỡ

thay đổi nội dung bởi: tiendungkct, 24-02-2009 lúc 10:42 PM.
tiendungkct vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
 

Ðiều Chỉnh
Xếp Bài

Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 11:36 PM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam