hongguan 发表于 2018-6-7 16:40:39

STC8A8K64S4A12单片机硬件从机的疑问

    我用例子源码测试,主机发送5a,00;读取6个字节,第一个字节是0xff; 访问从机一切正常.
但当我想将第一个字节返回值改成0x5a.问题来了.读取2次后会死机.用逻辑分析仪查看发现是停止位超时.SDA线没有拉高.
有没有网友碰到此问题.给点建议.谢谢!


#include "reg51.h"
#include "intrins.h"

sfr   P_SW2       =   0xba;

#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;

bit isda;                                       //设备地址标志
bit isma;                                       //存储地址标志
unsigned char addr;
unsigned char pdata buffer;

void main()
{
    P_SW2 = 0x80;

    I2CCFG = 0x81;                              //使能I2C从机模式
    I2CSLADR = 0x5a;                            //设置从机设备地址为5A
    I2CSLST = 0x00;
    I2CSLCR = 0x00;                           //禁止从机模式中断

    isda = 1;                                 //用户变量初始化
    isma = 1;
    addr = 0;
    I2CTXD = buffer;

    while (1)
    {
      if (I2CSLST & 0x40)
      {
            I2CSLST &= ~0x40;                   //处理START事件
      }
      else if (I2CSLST & 0x20)
      {
            I2CSLST &= ~0x20;                   //处理RECV事件
            if (isda)
            {
                isda = 0;                     //处理RECV事件(RECV DEVICE ADDR)
            }
            else if (isma)
            {
                isma = 0;                     //处理RECV事件(RECV MEMORY ADDR)
                addr = I2CRXD;
                I2CTXD = buffer;
            }
            else
            {
                buffer = I2CRXD;      //处理RECV事件(RECV DATA)
            }
      }
      else if (I2CSLST & 0x10)
      {
            I2CSLST &= ~0x10;                   //处理SEND事件
            if (I2CSLST & 0x02)
            {
                I2CTXD = 0x5a;<----------- 此处原来的值是0xff; 如果改成0x5a,主机读取会超时(死机).
            }
            else
            {
                I2CTXD = buffer[++addr];
            }
      }
      else if (I2CSLST & 0x08)
      {
            I2CSLST &= ~0x08;                   //处理STOP事件
            isda = 1;
            isma = 1;
      }
    }
}

hongguan 发表于 2018-6-8 09:35:00

自己坐沙发!{:smile:}

su33691 发表于 2018-6-8 10:02:48

楼主看看这个帖子
https://www.amobbs.com/thread-5683296-1-2.html
最新的版本好像已经解决了。

su33691 发表于 2018-6-8 10:07:27

hongguan 发表于 2018-6-10 12:09:56

这个功能不敢用了.现在用C8051F500可以.只是这种C8051性价比太低.用STC就是图便宜,结果这个坑太深.

jim166783 发表于 2019-9-6 21:19:15

从机代码有点问题 改良一下测试稳定

hongguan 发表于 2019-9-12 13:48:17

jim166783 发表于 2019-9-6 21:19
从机代码有点问题 改良一下测试稳定

给分享一下?

zzz1367 发表于 2022-10-19 16:31:58

现在这个问题 解决了吗?正打算用。。。。。

国学芯用 发表于 2022-10-19 16:59:19

现在是升级版STC8A8K64D4系列,ADC更完美 数据手册:https://www.stcai.com/filedownload/610801
新网站www.STCAI.com

zzz1367 发表于 2022-10-19 17:24:10

国学芯用 发表于 2022-10-19 16:59
现在是升级版STC8A8K64D4系列,ADC更完美 数据手册:https://www.stcai.com/filedownload/610801
新网站www ...
(引用自9楼)

谢谢。希望STC越做越好。。。。。。{:victory:}
页: [1]
查看完整版本: STC8A8K64S4A12单片机硬件从机的疑问