windman 发表于 2025-5-14 19:48:48

很简单的IO口问题,却让我踩了个坑,麻烦版主给解释一下,以便更好地理解STC 1T单片机

<p>东西很简单,就是通过跳线配置地址与别家的板子进行I2C通讯,已确认使用STC8H4K64TL-LQFP44板子硬件没有问题,却死活连不上。各种复杂情况都去猜想排除了,折腾一天最后发现,是自认为最简单最不可能出问题的IO读取部分程序出了问题,该段代码如下,大家帮忙看看有什么问题,应该怎么改:</p>
<pre><code>//检测接口P26、P27是否短接
P26=0;        P27=1;
PIN_MODE_IO(2,6);PIN_MODE_IO(2,7);
_nop_();_nop_();_nop_();
if (P27==0)        //检测跳线,确定硬件中断I2C从机地址
{
    I2C_slaveInit(I2C_SLAVE1_ADDR);                //有跳线为一号板
}
else
{
    I2C_slaveInit(I2C_SLAVE2_ADDR);                //无跳线为二号板
}
//恢复检测引脚高阻节电
P26=1;        P27=1;
PIN_MODE_HZ(2,6);PIN_MODE_HZ(2,7);

</code></pre>
<p>实际最后抓波形确认的情况是,无论连接P26、P27的拨码开关是否接通(已检测确认拨码开关和电路连接没有问题),配置的都是一号板的地址,二号板始终拒收连不上。害得我把以前不愿动手的从机SDA_LOW_LOCK代码都补全了,还是不行(因为这段代码就算我这种菜鸟都认为太简单了,根本没去DEBUG它 )。只能搬出存储示波器抓波形才发现是地址问题<img alt="lenghan" class="emoji" src="https://www.stcaimcu.com/static/image/smiley/default/lenghan.gif" title="lenghan" />。</p>

国芯人工智能 发表于 2025-5-14 20:08:01

针对您描述的I2C地址配置异常问题,经代码分析可定位以下三个关键技术点需要修正:

一、引脚模式配置逻辑错误
原代码采用PINMODEIO(2,6)和PINMODEIO(2,7)进行模式设置,但未明确区分输入输出方向。在STC8H系列单片机中,正确的配置应为:
```c
// P2.6设为推挽输出模式(配置地址检测信号源)
P2M1 &= ~(1

[本文内容由国芯人工智能辅助生成,仅供参考]

ercircle 发表于 2025-5-14 20:45:55

PIN_MODE_IO是自定义函数?
新建一个工程单独测P27也无法拉低?
建议上传完整代码,电路原理图

windman 发表于 2025-5-14 22:22:29

<p>PIN_MODE_IO(portNum, pinBitNum)是自定义宏,PIN_MODE_IO(2,6)的语义是把P2端口的第6位设置为弱上拉的准双向IO口,这个宏从STC12A开始就在用,已经用过好几年了,也经过很多实际应用的检验,应该是没有问题的,感觉对STC8H也能适用,无非就是对STC8H.h里面定义的P2M0,P2M1两个寄存器进行相应bit的组合设置,PIN_MODE_IO(2,6)宏预编译后实际生成如下2个语句:</p>
<pre><code>P2M0 &amp;=(~(1&lt;&lt;6));
P2M1 &amp;=(~(1&lt;&lt;6));
</code></pre>
<p>原理图如下:</p>
<p><img src="data/attachment/forum/202505/14/215249k75qzbj7jc0003q0.jpg" alt="屏幕截图2025-05-14214842.jpg" title="屏幕截图 2025-05-14 214842.jpg" /></p>
<p>帖子里面的代码已经能描述出我遇到的问题,而且也仅仅这段代码与管脚检测有关,其它代码都是I2C半双工通讯的内容,与管脚检测无任何关联性,就不上传完整工程代码了,免得读一大堆我的垃圾代码浪费大家时间。</p>

windman 发表于 2025-5-14 23:36:29

<p>非常感谢版主百忙之中的回复!受宠若惊<img alt="aixin" class="emoji" src="https://www.stcaimcu.com/static/image/smiley/default/aixin.gif" title="aixin" /></p>
<p>1、端口模式的设置感觉应该没有问题,用咱家单片机也不是一天两天了;</p>
<p>2、代码段的第一行语句P26=0;        P27=1;已经定义了输入、输出方向,即P26输出,P27输入。硬件上两脚直接用一个DIP开关连接,参见我在二楼的回复;</p>
<p>3、大佬的建议:将P26设置成推挽输出确实是个逻辑上更完美的思路。但感觉鉴于STC8H准双向模式端口与推挽几乎无异的‘下拉’能力,把另一个弱上拉的高电平端口拉低,逻辑上应该也没有问题。只是同样的代码,在原来非1T的STC12和15系列上用地好好的,到1T的STC8H上却有点翻车了;</p>
<p>4、发此贴的目的是想搞清楚为啥STC8H的管脚在翻转后再立即读取会反应这么慢,仿真运行时都有点逻辑悖论的感觉,注意下面debug调试截图中P27的值与程序实际执行的代码指针PC(断点)位置,P27的值显示为1却运行到了判断P27==0条件成立的断点处(这段代码只在初始化时执行一次,并没有循环执行)。这种问题是与1T系列新的MCU内部预解码的指令流有关?还是Keil IDE的BUG?(这个老家伙和川建国一样总是反复无常,强烈建议姚总赶紧弄个自己的一体化AI_IDE或者与gcc兼容的AI编译器(IDE直接用VS Code)管它啥双DPTR,就是8DPTR也直接支持优化<img alt="ciya" class="emoji" src="https://www.stcaimcu.com/static/image/smiley/default/ciya.gif" title="ciya" /> 。开玩笑的,C51架构已经没有前途,至少C251起步了)</p>
<p><img src="https://www.stcaimcu.com/data/attachment/forum/202505/14/231000ncsebqqb0vysybwh.jpg" alt="判断逻辑值与PC指针.jpg" title="判断逻辑值与PC指针.jpg" /></p>
<p>5、另外,1T新增的端口电平转换速度控制寄存器原理上是真的配置端口驱动时钟,还是直接清除预取指令队列流,从而达到提高端口响应速度的目的?还请大佬不吝赐教。</p>

ercircle 发表于 2025-5-14 23:47:45

windman 发表于 2025-5-14 22:22
PIN_MODE_IO(portNum, pinBitNum)是自定义宏,PIN_MODE_IO(2,6)的语义是把P2端口的第6位设置为弱上拉的准 ...

复现不了,功能正常,8H 11.0592MHz测试~

windman 发表于 2025-5-18 16:09:37

ercircle 发表于 2025-5-14 23:47
复现不了,功能正常,8H 11.0592MHz测试~

感谢大侠百忙之中的回复!
我下载并试验了您的测试程序,纯软件模拟仿真确实是没有这个问题的。但只要是实体芯片仿真,即下载到芯片后仿真(我用的是串口仿真)设置断点后再运行,您给的试验程序同样出现了我帖子里面所说的问题。

王昱顺 发表于 2025-5-18 16:43:22

windman 发表于 2025-5-18 16:09
感谢大侠百忙之中的回复!
我下载并试验了您的测试程序,纯软件模拟仿真确实是没有这个问题的。但只要是 ...

将程序中的_nop_();_nop_();_nop_();部分
改成1ms的软件延时试试呢?使用更长一点的时间,可能是内部流水线结构,输出到输入有一些延迟的问题

ercircle 发表于 2025-5-18 16:48:22

windman 发表于 2025-5-14 23:36
非常感谢版主百忙之中的回复!受宠若惊
1、端口模式的设置感觉应该没有问题,用咱家单片机也不是一天两天了 ...

我是下载到板子上直接运行的,至于仿真变量不一致,
我之前也测到过,watch和callstack里值和鼠标悬浮值不一样,keil bug吧。

keil仿真测试 - 问题反馈:ISP软件/头文件/单片机数据手册规格书等 国芯技术交流网站 - AI32位8051交流社区



windman 发表于 2025-5-20 02:11:06

<p>果然论坛有高人<img alt="qiang" class="emoji" src="https://www.stcaimcu.com/static/image/smiley/default/qiang.gif" title="qiang" /> 按大侠说的延迟约10us左右,问题已完美解决!非常感谢!!!</p>
<p>经多次验证试验,确认是模式设置语句执行完到产生实际效果间有延迟,在此间若判断引脚电平就会出错。原以为是管脚翻转慢,加几个nop就可以了,实际上管脚翻转没有问题,2~3个CP即可翻转完成。希望小伙伴们以后编程能注意一下此问题,以避免再踩一次这个坑。</p>
<p>再次感谢版主及各位老师对此贴的关注与回复指导,你们的不吝赐教使我不仅解决了实际问题,更学到了很多书本上学不到的知识,受益匪浅,万分感谢!!<img alt="baoquan" class="emoji" src="https://www.stcaimcu.com/static/image/smiley/default/baoquan.gif" title="baoquan" /></p>
页: [1]
查看完整版本: 很简单的IO口问题,却让我踩了个坑,麻烦版主给解释一下,以便更好地理解STC 1T单片机