Rs428 发表于 2023-12-10 18:09:00

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

#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));这里循环,不知道是啥问题,大佬们帮我看看吧{:4_184:}

Rs428 发表于 2023-12-10 18:09:22

大佬们帮我康康吧{:4_184:}{:4_184:}{:4_184:}

神农鼎 发表于 2023-12-10 18:24:25

用上仿真来查卡在哪,而不是猜


神农鼎 发表于 2023-12-10 18:25:52





神农鼎 发表于 2023-12-10 18:27:39



仿真 STC8 系列 MCU,用 STC-USB Link1D ! 有视频讲解 - 仿真/ISP下载/做自己的ISP/编译器/头文件 - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)




Rs428 发表于 2023-12-10 18:35:38

神农鼎 发表于 2023-12-10 18:24
用上仿真来查卡在哪,而不是猜

大佬我能把我自己这个单片机烧成仿真再看嘛

Rs428 发表于 2023-12-11 11:07:54

神农鼎 发表于 2023-12-10 18:24
用上仿真来查卡在哪,而不是猜

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

乘风飞扬 发表于 2023-12-11 11:19:49

Rs428 发表于 2023-12-11 11:07
大佬们,仿真里边的IIC在哪呀,为啥有SPI没看到IIC相关的寄存器😭

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

你使用附件例程试试

Rs428 发表于 2023-12-13 22:29:20

乘风飞扬 发表于 2023-12-11 11:19
用你的代码试了一下,没什么问题,只是增加了"stc8h.h"头文件

你使用附件例程试试


谢谢大佬,我去试试,我后面用中断查询的方法成功访问了IIC器件{:4_197:}

神农鼎 发表于 2023-12-14 08:24:32

I2C/SPI/串行口,我们组织了专门的 视频讲解

视频教学《USB型 1T 8051 单片机原理及应用-STC8H8K64U》,山东大学陈桂友教授 - 视频教学,《单片机原理及应用》教学改革及实践研讨会,实战技术交流会,会务通知 - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)
页: [1] 2
查看完整版本: 大佬们求教!STC8H IIC 启动函数一直循环,无法正常使用