在线时间1 小时
UID3103353
注册时间2015-3-2
NXP金币0
该用户从未签到
新手上路

- 积分
- 9
- 最后登录
- 2015-3-14
|

楼主 |
发表于 2015-3-14 16:51:09
|
显示全部楼层
有结果了,首先发现教课书主机程序源代码上有个错误,即重新匹配地址后,主机改为接收模式,应为:BCLR(I2C_C1_TX_SHIFT,I2C_C1_REG(num)); //TX = 0,MCU设置为接收模式
而源程序为,BCLR(I2C_C1_RSTA_SHIFT,I2C_C1_REG(num));显然不对。
然后是从机中断的代码:
//============================================================================
//函数名称:I2C0_isr
//功能概要: I2C0中断服务程序,其负责接收主机发送过来的数据并置位flag标志,通知main中主循环打印该数据
//参数说明:
// x:x = 'T'(Transmission),等待一个字节 数据传输完成
//函数返回: 无
//============================================================================
void I2C0_isr(void)
{
uint_8 i;
uint_8 data;
enter_critical(); // 进入临界区
if(i2cwait('T')) //等待一个数据传送完成
{
i=I2C0_D; //读出IIC1D,准备接收数据
goto lab;
}
//if((I2C0_S & 0x40)!=0) //主机发送的地址与本机的默认地址匹配
if((I2C0_S & I2C_S_IAAS_MASK)!=0) //主机发送的地址与本机的默认地址匹配
{
i=I2C0_S & I2C_S_SRW_MASK;
if(i==0)
{
if(0!=j)
{
j=0;
goto lab;
}
BCLR(I2C_C1_TX_SHIFT,I2C0_C1); //TX = 0,MCU设置为接收模式
}
else//地址第0位位1,从机发送数据。
{
if(2==j)//如果是第二次匹配地址
{
//i=I2C0_D;
BSET(I2C_C1_TX_SHIFT,I2C0_C1); //TX = 1,MCU设置为发送模式
I2C0_D =buf[visitaddr]; //将数据写进寄存器,准备发送数据
if(i2cwait('T')) //等待一个数据传送完成
{
i=I2C0_D; //读出IIC1D,准备接收数据
goto lab;
}
BCLR(I2C_C1_TX_SHIFT,I2C0_C1); //TX = 0,MCU设置为接收模式
i=I2C0_D; //读出IIC1D,准备接收数据
}
j=0;
goto lab;
}
i=I2C0_D; //读出IIC1D,准备接收数据
j++;
}
else //接收到的为数据
{
if(1==j) //接收到主机发送过来的访问地址
{
visitaddr=I2C0_D; //读出IIC1D,准备接收数据
j++;goto lab;
}
if(2==j) //接收到主机发送过来的数据
{
data=I2C0_D; //读出IIC1D,准备接收数据
j++;
}
//如果从机地址匹配、访问地址与数据均接收到则将接收到的数据存入buf数组
if(3==j)
{
buf[visitaddr]=data;
flag=1; //置位该标志表明成功接收到主机发送过来的数据
}
j=0;
}
lab: exit_critical(); // 离开临界区
}
|
|