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;
}
}
}
自己坐沙发!{:smile:} 楼主看看这个帖子
https://www.amobbs.com/thread-5683296-1-2.html
最新的版本好像已经解决了。 这个功能不敢用了.现在用C8051F500可以.只是这种C8051性价比太低.用STC就是图便宜,结果这个坑太深. 从机代码有点问题 改良一下测试稳定 jim166783 发表于 2019-9-6 21:19
从机代码有点问题 改良一下测试稳定
给分享一下? 现在这个问题 解决了吗?正打算用。。。。。 现在是升级版STC8A8K64D4系列,ADC更完美 数据手册:https://www.stcai.com/filedownload/610801
新网站www.STCAI.com 国学芯用 发表于 2022-10-19 16:59
现在是升级版STC8A8K64D4系列,ADC更完美 数据手册:https://www.stcai.com/filedownload/610801
新网站www ...
(引用自9楼)
谢谢。希望STC越做越好。。。。。。{:victory:}
页:
[1]