打印
[技术支持]

HC18M003的IIC设备通讯问题

[复制链接]
4492|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
suncat0504|  楼主 | 2023-10-26 14:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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不是主机接收模式下才应该有的状态值吗?怎么会出现在主机发送模式下?
期望获得技术专家的帮助。

使用特权

评论回复
沙发
suncat0504|  楼主 | 2023-10-26 14:49 | 只看该作者
另外补充说明下,使用IO模拟IIC的方式,程序能走通。现在就是对如何正确使用IIC的寄存器以及如何正确按照步骤操作,理解不到位。哪怕能让数据从IIC外设上输出,能看到波形都成啊。

使用特权

评论回复
板凳
两只袜子| | 2024-8-20 14:46 | 只看该作者
检查硬件连接

使用特权

评论回复
地板
shenxiaolin| | 2024-8-30 15:20 | 只看该作者
检查硬件连接,做超时处理

使用特权

评论回复
5
suncat0504|  楼主 | 2024-8-31 09:37 | 只看该作者
shenxiaolin 发表于 2024-8-30 15:20
检查硬件连接,做超时处理

问题已经解决了,是没有正确设置ACK导致的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:大连伊飞特信息技术有限公司软件工程师
简介:本人于1993年毕业于大连理工大学。毕业后从事单片机开发工作5年,之后转入软件开发工作至今。

119

主题

3675

帖子

5

粉丝