历史上的今天

今天是:2024年11月11日(星期一)

正在发生

2019年11月11日 | STM8S003的GPIO模拟I2C切换输入输出的解决办法

发布者:EtherealGaze 来源: eefocus关键字:STM8S003  GPIO  模拟I2C  输入输出 手机看文章 扫描二维码
随时随地手机看文章

刚开始学STM8,很多东西刚了解,正在做一个温湿度显示小板,就是使用I2C驱动SHT20传感器,并显示到数码管,数码管用的四位一体共阴数码管,STM8管脚有限,添加了一片TM1650做驱动,不过SHT20和TM1650都是用的I2C接口,由于对STM8硬件I2C还不了解,先打算用软件模拟,这就涉及到需要对GPIO做输入输出切换处理来检测ACK响应,刚开始,直接操作DDR寄存器,但是出现从输出切换到输入就会出现单片机死机,不解,查资料,得到一个解决办法,在输出状态时,可以不用切换到输入,我使用管脚D4,D5这两个管脚,这两个管脚比较特殊,就是真正开漏,在管脚描述为T,其它描述为HS(高吸收电流)。


解决办法,将IO设置为开漏输出,外部加上拉,做输入使用之前先输出高,再读取IO状态,即可,附上I2C代码:



#include "swiic.h"

 

void Delay_us(uint8_t i) //nus 粗略延时

{

    for(; i>0; i--)

    {

        asm("nop");                

        asm("nop");  

        asm("nop");

        asm("nop");  

        asm("nop");

    }        

}

 

/*================================================================

【  Name  】void I2CInit(void)

【Function】I2C初始化,空闲状态

【  Notes 】

【 Author 】Jack

【  Data  】2012.08.07

================================================================*/

void I2CInit(void)

{

SDA = 1;

Delay_us(5);

SCL = 1;

Delay_us(5);

}

 

void I2CStart(void) //开始信号

{

SCL = 1;

SDA = 1;

Delay_us(5);

SDA = 0;  

Delay_us(5);

}

void I2CStop(void) //停止信号

{

    Delay_us(5);

SCL = 1;

SDA = 0;    

Delay_us(5);

SDA = 1;

}

 

uint8_t I2Cask(void) //ACK信号

{

uint8_t timeout = 1;

SCL = 1;

    SDA = 1;        //输入之前先输出高

Delay_us(5);

 

while((SDA_IN)&&(timeout<=100))

{

        timeout++;

}

 

Delay_us(5);

SCL = 0;

    Delay_us(5);   

    if(timeout >= 100)return NACK;

    else return ACK;

}

 

 

void I2CWrByte(uint8_t Byte) //写一个字节高位在前,低位在后

{

uint8_t i;

SCL = 0;

Delay_us(1);

for(i=0;i<8;i++)

{

if(Byte&0x80)

{  

            SDA = 1;

        }else

{  

            SDA = 0;  

        } 

Byte <<= 1; 

SCL = 0;

Delay_us(5);

SCL = 1;

Delay_us(5);

SCL = 0;

        Delay_us(5);

}

Delay_us(5);   

}

 

/*================================================================

【  Name  】uchar I2CRdByte(uchar AckValue)

【Function】I2C读一个字节数据,入口参数用于控制应答状态,ACK或者NACK

【  Notes 】从高到低,依次接收

【 Author 】dingshidong

【  Data  】2012.08.07

================================================================*/

uint8_t I2CRdByte(uint8_t AckValue)//receivebyte

{

uint8_t i,RDByte=0;

SCL = 0;                                            //置时钟线为低,准备接收数据位--ZLG

    SDA = 1;        //输入之前先输出高     

    Delay_us(2);

for (i=0;i<8;i++) 

{        

SCL = 1;                           //SCL高电平期间,采集SDA信号,并作为有效数据 //置时钟线为高使数据线上数据有效--ZLG 

Delay_us(2); 

RDByte <<= 1;                                   //移位

if(SDA_IN==1)                                 //采样获取数据

{

RDByte |= 0x01;

}

else

{

RDByte &= 0xfe;

}

       

Delay_us(5);

SCL = 0;                                  //下降沿,从机给出下一位值

Delay_us(5);

       

}   

/*以下是I2C总线发送应答信号ACK或者NACK*/

if(1==AckValue)                     //应答状态 

{

SDA = 1;

}

else

{

SDA = 0;

}

                          

Delay_us(3);

SCL = 1;

Delay_us(5);                        //时钟低电平周期大于4μs--ZLG

SCL = 0;                                 //清时钟线,钳住I2C总线以便继续接收--ZLG               

Delay_us(15);

       

return RDByte;

}

关键字:STM8S003  GPIO  模拟I2C  输入输出 引用地址:STM8S003的GPIO模拟I2C切换输入输出的解决办法

上一篇:STM8 I2C从机
下一篇:STM8L驱动I2C类型的12864

推荐阅读

  多个可乐瓶环绕,扫地机器人灵巧地穿梭其中清除杂物,没有触碰到任何一个障碍物。这是在上海国家会展中心5号馆Neato的展台前可以看到的场景。   “目前,市场上的扫地机器人大多是靠碰撞的方式探测前方物体,可能会对家具、家电等造成损坏。我们的扫地机器人应用汽车技术,克服了这个缺点。重要的是,它们能够清理屋内的微小尘埃,非常适合北方居...
Clock Prescaler:和系统时钟同步并且二分频Sampling Time :采样时间,采样时间是你通过寄存器告诉STM32采样模拟量的时间,设置越长越精确
据科创板日报消息,神州数码和荣耀方面回应了关于“华为拟1000亿元出售荣耀品牌给深圳政府和神州数码”的传闻。神州数码证券部人士回复称:“传闻,我们不回应。”荣耀市场沟通部人士则回应称:“目前还没有回应,我们内部都不知道,也是看媒体在报道。据悉,路透社报道援引知情人士消息报道称,华为计划以1000亿元出售荣耀品牌给深圳政府和神州数码。他并...
: Víctor Mayoral-Vilches 和 Giulio Corradi,公司 连载七:用ROS 2 在机器人内部集成自适应计算的新架构 图 1 所示的架构将硬件加速集成到 ROS 2 中,同时坚持以机器人专家为中心的理念。不要求熟悉非 ROS (如 Vivo 或 Vis 工具),或熟悉 OpenEmbedded 或 Yocto。此外,该架构构建在开放的标准之上,以 ++ 和 OpenCL 作...

史海拾趣

问答坊 | AI 解惑

在SoPC上实现的波形发生器

        SoPC可编程片上系统是一种特殊的嵌入式微处理器系统。首先,它是片上系统(SOC),即由单个芯片完成整个系统的主要逻辑功能;其次,它是可编程系统,以FPGA为硬件基础,具有灵活的设计方式,可裁减、可 ...…

查看全部问答∨

如何查看本机所开端口

用netstat -a —n命令查看!再state下面有一些英文,我来简单说一下这些英文具体都代表什么 LISTEN:侦听来自远方的TCP端口的连接请求 SYN-SENT:再发送连接请求后等待匹配的连接请求 SYN-RECEIVED:再收到和发送一个连接请求后等待对 ...…

查看全部问答∨

最近在做开关电源,给大家几份资料...逆变的,呵呵...可能不适合还望海涵

最近在做开关电源,给大家几份资料...逆变的,呵呵...可能不适合还望海涵…

查看全部问答∨

时间控制器

本帖最后由 paulhyde 于 2014-9-15 08:57 编辑 时间控制器 时间控制器 时间控制器  …

查看全部问答∨

谁能设计一个专为宠物拾粪的器械

养宠物当然是一件令人高兴的事情,但是要为它们打扫粪便就未必那么令人高兴了。很多小区也有这样的问题在。在欧美国家,人们通常采用的方式就是用手套着塑料袋将粪便捡起来,然后找到附近的垃圾箱扔进去。虽然隔着一层塑料袋,但是这种方式还是会令 ...…

查看全部问答∨

求助从一个232到四个RS422的连线问题

先谢谢你们帮忙我! 做个从外面进来一个RS232信号,分别转接4个RS422时,MAX232的TXIN和RXOUT直接可以接到四个MAX491的RO和DI脚吗? 好像是就接一个的话是不是直接可以这样接?用不用别的光电耦合器什么的?…

查看全部问答∨

VS2005 VS2008 Mobile5PPC

机器上同时安装VS2005、VS2008,在安装Mobile5PPC SDK时,总是关联到VS2008。 怎样才能关联到VS2005…

查看全部问答∨

怎么支持大容量SD卡

使用wince 6   打上r2及到2009。4月的所有补丁 硬件:S3C2443 以下是调试过程中的输出: SendCommand (0xd2998b60, 0x0005, 0x00000000, 0x0005, 0x0) starts CreaGetCommandResponse returned SD_API_STATUS_RESPONSE_TIMEOUT (COMM ...…

查看全部问答∨

MSP430F149的串口问题

我用430F149开发一个小语音芯片,用到了SPI串口,现在想用串口调试助手把整个系统测试下,结果发现UART0被SPI已经占用了,异步串口的3.4和3.5口始终输出高电平,板子做好了已经不好改了,不知道还有什么办法解决一下! 另:这个片子的串口UART和管 ...…

查看全部问答∨

顶层模块调用底层模块的端口信号,仿真时出错~~~

设计的是三个层次的模块,顶层模块topcpu.v,中间模块cpu.v,底层模块adr.v我在topcpu.v中调用adr的端口信号pc_addr,仿真的时候出错:Unresolved reference to \'m_adr\' in t_cpu.m_adr.这是我的调用语句 while(test==1)     &nbs ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved