本帖最后由 suncat0504 于 2023-10-26 14:45 编辑
这两天一直在搞HC18M003在主机发送模式下的通讯,直到现在也没有调通。从示波器上获得的波形来看,好像向ICCDAT传送数据后,数据根本就没有从SDA数据线上输出出来。另外,根据文档中主机发送模式下的流程图看,根本就对不上。另外说明一点,官方提供的主机发送例程中,有一段代码好像有问题:
void main()
{
/************************************系统初始化****************************************/
OSCCON = 0x04; //Fosc=32M Fcpu=4M(Fosc4分频 2T)
/************************************IO初始化*****************************************/
ANSELC = 0xFF; //SCL映射PC2 SDA映射PC0时IO配置
TRISD = 0x04; //SCL映射PC2 SDA映射PC0时IO配置
IICMAP = 0x11; //SCL映射PC2 SDA映射PC0 映射后默认将IIC_SDA口设为开漏带上拉输出
/************************************IIC初始化*****************************************/
IICCON = 0x40; //启动IIC模块
GIE = 1; //允许总中断
PEIE = 1; //允许未屏蔽中断
IICIE = 1; //允许IIC中断
while(1)
{
IICSendReceiveStart(0,0xAA); //0,AA:IIC开始发送AA
while(gbt_IICBusyingFlag); //发送中,忙信号
IICSendReceiveStart(1,0xAA); //1,AA:IIC接收从机数据,AA无效,可写任意值
while(gbt_IICBusyingFlag); //接收中,忙信号
}
}
例程中是以PC2作为SCK用,PC0作为SDA使用,使用内部IIC设备,但在示例代码中,设置关联IO时,用的是ANSELC,而在设置IO输入输出时,用的是TRISD。难道不应该是TRISC吗?
我简单把测试过程说一下。我想用HC18M003作为IIC主机,把其它IIC器件作为从机。从机只是单纯地接收数据。按照文档中的说明:
一、初始化IIC相关寄存器
1. ANSELC = 0xFF;
IICMAP = 0x11;
// PORTC2为输出模式
TRISC = 0x05; // PC2和PC0输出模式
IICCON = 0x40; //启动IIC模块
2. 在中断处理中保存发生中断时的状态值,并清除中断标志
二、在向从机发送数据时,按照以下逻辑处理(每次收到一字节数据,从机是有ACK应答的)
1、发送“Start”信号,等待中断,接收状态值
2、若1的状态值是08H,使STA=0,后续IIC发送不再发送“START”信号
3、向IICDAT赋值,发射从机地址+写标志位,等待中断,接收状态值
4、若3的状态值是18H,则继续向IICDAT赋值,发射要传输的数据,等待中断,接收状态值
5、若4的状态值是28H,则表示整个发送正常结束。发送“结束信号”
这个发送逻辑是按照指几发送模式的逻辑图编写代码的。结果执行起来,出问题了。
首先:第一次发送“START”信号后,IIC中断中收到的状态值为“08H”,然后后续的处理就不正常了,发送完地址+写的数据,收不到“18H”状态值,所以处理就终止了。
在中断处理中,不停地收到10H,48H这两个数据。用示波器监视波形,发现像IICDAT赋值,并没有在数据线上检测到波形变化。SDA这条线似乎总是处于高电平状态。事实上在波形上看到“START”信号后,SDA就一直处于高电平状态。另外,48H不是主机接收模式下才应该有的状态值吗?怎么会出现在主机发送模式下?
期望获得技术专家的帮助。
|