找回密码
 立即注册
查看: 1663|回复: 10

大佬们求教!STC8H IIC 启动函数一直循环,无法正常使用

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-02-22 00:30:48

2

主题

10

回帖

92

积分

注册会员

积分
92
发表于 2023-12-10 18:09:00 | 显示全部楼层 |阅读模式
#include "stc8.h"
#include "intrins.h"

#define I2CCFG      (*(unsigned char volatile xdata *)0xfe80)
#define I2CMSCR     (*(unsigned char volatile xdata *)0xfe81)
#define I2CMSST     (*(unsigned char volatile xdata *)0xfe82)
#define I2CSLCR     (*(unsigned char volatile xdata *)0xfe83)
#define I2CSLST     (*(unsigned char volatile xdata *)0xfe84)
#define I2CSLADR    (*(unsigned char volatile xdata *)0xfe85)
#define I2CTXD      (*(unsigned char volatile xdata *)0xfe86)
#define I2CRXD      (*(unsigned char volatile xdata *)0xfe87)

sbit    SDA     =   P1^4;
sbit    SCL     =   P1^5;

#define FOSC        11059200UL
#define BRT         (65536 - FOSC / 115200 / 4)

void Wait()
{
    while (!(I2CMSST & 0x40));
    I2CMSST &= ~0x40;
}

void Start()
{
    I2CMSCR = 0x01;                             //发送START命令
    Wait();
}

void SendData(char dat)
{
    I2CTXD = dat;                               //写数据到数据缓冲区
    I2CMSCR = 0x02;                             //发送SEND命令
    Wait();
}

void RecvACK()
{
    I2CMSCR = 0x03;                             //发送读ACK命令
    Wait();
}

char RecvData()
{
    I2CMSCR = 0x04;                             //发送RECV命令
    Wait();
    return I2CRXD;
}

void SendACK()
{
    I2CMSST = 0x00;                             //设置ACK信号
    I2CMSCR = 0x05;                             //发送ACK命令
    Wait();
}

void SendNAK()
{
    I2CMSST = 0x01;                             //设置NAK信号
    I2CMSCR = 0x05;                             //发送ACK命令
    Wait();
}

void Stop()
{
    I2CMSCR = 0x06;                             //发送STOP命令
    Wait();
}

void Delay()
{
    int i;

    for (i=0; i<3000; i++)
    {
        _nop_();
        _nop_();
        _nop_();
        _nop_();
    }
}

void UartInit()
{
    SCON = 0x5a;
    T2L = BRT;
    T2H = BRT >> 8;
    AUXR = 0x15;
}

void UartSend(char dat)
{
    while (!TI);
    TI = 0;
    SBUF = dat;
}

void main()
{
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;

    P_SW2 = 0x80;

    I2CCFG = 0xe0;                              //使能I2C主机模式
    I2CMSST = 0x00;
       
                UartInit();

       Start();                                    //发送起始命令------------------------------->这里注释掉就可以正常跑了
//    SendData(0xa2);                             //发送设备地址+写命令
//    RecvACK();
//    SendData(0x02);                             //发送存储地址
//    RecvACK();
//    SendData(0x00);                             //设置秒值
//    RecvACK();
//    SendData(0x00);                             //设置分钟值
//    RecvACK();
//    SendData(0x12);                             //设置小时值
//    RecvACK();
//    Stop();                                     //发送停止命令

    while (1)
    {
                        UartSend(0xff);
//        Start();                                //发送起始命令
//        SendData(0xa2);                         //发送设备地址+写命令
//        RecvACK();
//        SendData(0x02);                         //发送存储地址
//        RecvACK();
//        Start();                                //发送起始命令
//        SendData(0xa3);                         //发送设备地址+读命令
//        RecvACK();
//        P0 = RecvData();                        //读取秒值
//        SendACK();
//        P2 = RecvData();                        //读取分钟值
//        SendACK();
//        P3 = RecvData();                        //读取小时值
//        SendNAK();
//        Stop();                                 //发送停止命令

//        Delay();
    }
}



大佬们,上面是我的代码,我的iic就是P14和P15,这个Start()函数一执行就一直在while (!(I2CMSST & 0x40));这里循环,不知道是啥问题,大佬们帮我看看吧

回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-02-22 00:30:48

2

主题

10

回帖

92

积分

注册会员

积分
92
发表于 2023-12-10 18:09:22 | 显示全部楼层
大佬们帮我康康吧
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:100
  • 最近打卡:2025-06-17 08:13:13

734

主题

1万

回帖

1万

积分

管理员

积分
16690
发表于 2023-12-10 18:24:25 | 显示全部楼层
用上仿真来查卡在哪,而不是猜

截图202312101824197144.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:100
  • 最近打卡:2025-06-17 08:13:13

734

主题

1万

回帖

1万

积分

管理员

积分
16690
发表于 2023-12-10 18:25:52 | 显示全部楼层
截图202312101825174967.jpg

截图202312101825446741.jpg

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:100
  • 最近打卡:2025-06-17 08:13:13

734

主题

1万

回帖

1万

积分

管理员

积分
16690
发表于 2023-12-10 18:27:39 | 显示全部楼层
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-02-22 00:30:48

2

主题

10

回帖

92

积分

注册会员

积分
92
发表于 2023-12-10 18:35:38 来自手机 | 显示全部楼层
神农鼎 发表于 2023-12-10 18:24
用上仿真来查卡在哪,而不是猜

大佬我能把我自己这个单片机烧成仿真再看嘛
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-02-22 00:30:48

2

主题

10

回帖

92

积分

注册会员

积分
92
发表于 2023-12-11 11:07:54 来自手机 | 显示全部楼层
神农鼎 发表于 2023-12-10 18:24
用上仿真来查卡在哪,而不是猜

大佬们,仿真里边的IIC在哪呀,为啥有SPI没看到IIC相关的寄存器😭
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:445
  • 最近打卡:2025-06-17 12:12:21
已绑定手机

40

主题

2060

回帖

7089

积分

论坛元老

积分
7089
发表于 2023-12-11 11:19:49 | 显示全部楼层
Rs4*** 发表于 2023-12-11 11:07
大佬们,仿真里边的IIC在哪呀,为啥有SPI没看到IIC相关的寄存器😭

用你的代码试了一下,没什么问题,只是增加了"stc8h.h"头文件

你使用附件例程试试

STC8H IIC 启动函数.zip

12.94 KB, 下载次数: 101

回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-02-22 00:30:48

2

主题

10

回帖

92

积分

注册会员

积分
92
发表于 2023-12-13 22:29:20 | 显示全部楼层
乘风*** 发表于 2023-12-11 11:19
用你的代码试了一下,没什么问题,只是增加了"stc8h.h"头文件

你使用附件例程试试

谢谢大佬,我去试试,我后面用中断查询的方法成功访问了IIC器件
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:100
  • 最近打卡:2025-06-17 08:13:13

734

主题

1万

回帖

1万

积分

管理员

积分
16690
发表于 2023-12-14 08:24:32 | 显示全部楼层
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-18 07:55 , Processed in 0.141619 second(s), 99 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表