从机模式,从机接收中断
interrupt ISR(void)
{
char tmp;
// RC2=0;
if(SSP1IF==1)
{
SSP1IF=0;
if(D_nA==1) // 1 是数据
{
if(BF==1) // 缓冲区满,说明从主机收到一个字节
{
tmp=SSPBUF; // 保存收到的普通数据
if(tmp==0x23)
RC2=0; // 显示收到的数据
}
else // BF=0,主机读取结束
{
if(R_nW==1) // 读标志位有效,说明主机还在继续读数据
{
SSPBUF=0x06; // 把主机要的数据保存在SSPBUF中等待主机读取
}
else
{ // 读标志位无效,说明主机已经读取完最后一个字节了
}
}
}
else //0 是地址
{
tmp=SSPBUF;
if( (tmp & 0b00000001)!=0 ) // R/W =1,read
{
SSPBUF=0x06; // 准备好数据等待下一次主机读取
}
else //R/W=0, write
{
// 等待下一次主机来数据放到SSPBUF中
}
}
}
CKP=1; // 从机释放SCL
}
主机模式,主机数据发送
/*************************************************************************
函数功能:主机写模式
入口参数:CMD PACE 。
返 回:无。
备 注:无。
*************************************************************************/
void I2C_Write (uint8 add, uint8 CMD, uint8 PACE)
{
SEN=1; // 发送起始位
while(SEN); // SEN=1说明未发送完毕
// 循环退出说明SEN=0,即发送完毕
SSPBUF = add&Write; // 从机地址+写操作
while(R_nW); //R_nW=1说明数据发送进行中
// 循环退出说明R_nW=0,即发送完毕
if(ACKSTAT) // ACKSTAT为1说明未收到从机应答
while(1);// 死循环,便于调试,实际项目中应做错误处理
SSPBUF = CMD; //向从机写入数据 CMD
while(R_nW); //R_nW=1说明数据发送进行中
// 循环退出说明R_nW=0,即发送完毕
if(ACKSTAT) // ACKSTAT为1说明未收到从机应答
while(1); // 死循环,便于调试,实际项目中应做错误处理
SSPBUF = PACE; //向从机写入数据 PACE
while(R_nW); //R_nW=1说明数据发送进行中
// 循环退出说明R_nW=0,即发送完毕
if(ACKSTAT) // ACKSTAT为1说明未收到从机应答
while(1){LED=0;} // 死循环,便于调试,实际项目中应做错误处理
PEN=1; // 发送停止位
while(PEN); // PEN=1说明未发送完毕
// 循环退出说明PEN=0,即发送完毕
}
屏蔽掉红字部分代码,也就是一次只发送地址和一个数据时,没有问题
如果不屏蔽红字部分代码,一次发地址和俩个数据时,程序会死在LED=0;
|