Mong các bác chỉ giúp em phần I2C slave cho dsPIC.
Đây là toàn bộ chương trình cho con slave :
Code:
#include <p30f4011.h>
_FOSC(CSW_FSCM_OFF & FRC_PLL4);
_FWDT(WDT_OFF);
_FBORPOR(PBOR_ON & BORV_27 & PWRT_4 & MCLR_EN & RST_IOPIN);
_FGS(CODE_PROT_OFF);
#include <i2c.h>
void SI2C_init(void);
void slave_reply(unsigned char data);
unsigned char rcv_data,trn_data;
unsigned char data_request;
void _ISR_PSV _SI2CInterrupt(void)
{
_SI2CIF = 0;
if(_R_W) //Read data from Slave
{
data_request = 1;
}else //Write data to Slave
{
if(_D_A) //I2CRSR chua du lieu
rcv_data = I2CRCV;//doc du lieu
else //I2CRSR chua dia chi
Nop();//Khong lam gi ca
}
}
int main(void)
{
SI2C_init();
while(1)
{
if(data_request)
{
data_request = 0;
trn_data ++;
slave_reply(trn_data);
}
if(rcv_data)
{
rcv_data = 0;
}
}
return 0;
}
void SI2C_init(void)
{
I2CADD = 0x10;
I2CCON = I2C_ON & I2C_IDLE_STOP & I2C_CLK_REL
& I2C_IPMI_DIS & I2C_7BIT_ADD
& I2C_SLW_DIS & I2C_SM_DIS
& I2C_GCALL_DIS & I2C_STR_DIS
& I2C_ACK & I2C_ACK_DIS & I2C_RCV_DIS
& I2C_STOP_DIS & I2C_RESTART_DIS
& I2C_START_DIS;
IPC3bits.SI2CIP = 1;
IEC0bits.SI2CIE = 1;
_SI2CIF = 0;
}
void slave_reply(unsigned char data)
{
I2CTRN = data;
_SCLREL = 1;//Giai phong SCL
}
Vấn đề là không biết chương trình trên sai hay thiếu chỗ nào mà I2C master ko nhận được tín hiệu Ack từ slave khi truyền đến slave đó. Bus I2C ở đây chỉ có 2 IC và chương trình I2C Master đã chạy đúng với EEPROM.