STM8S003的GPIO模拟I2C切换输入输出的解决办法

2019-11-11来源: 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  输入输出 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic479613.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

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

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM8S103之IO复用
一、简介本文以STM8S103F3P6编程为例,介绍STM8S103F3P6如何引脚复用。二、实验平台电脑平台:Windows7 64位旗舰编译软件:IAR硬件平台:STM8S103F3P6三、版权声明四、实验前提1、在进行本文步骤前,请先安装IAR  EWSTM8-EV-1311版本;准备好STM8S103F3P6硬件平台。五、基础知识暂无六、源码地址暂无七、实验内容1.先阅读STM8S103F数据手册2.操作步骤以STM8S103F3P6的IO“PC6”为定时器1PWM输出为例:1)、配置定时器1为PWM输出void Init_Timer1(void){  GPIO_Init(GPIOC
发表于 2019-11-11
STM8S103之IO复用
STM8S_010_I2C读写EEPROM(硬件方式)
Ⅰ、写在前面相信看过前面那篇文章“更加深入理解I2C总线、协议及应用”的人对I2C都有一定的了解了。那篇文章是针对I2C,使用单片机IO模拟I2C方式实现读写操作。本文将讲述硬件I2C读写操作,也就是由处理器自身硬件的I2C实现时钟、数据的传输过程。Ⅱ、STM8硬件I2C知识STM8S的I2C模块不仅可以接收和发送数据,还可以在接收时将数据从串行转换成并行数据,在发送时将数据从并行转换成串行数据。可以开启或禁止中断。接口通过数据引脚(SDA)和时钟引脚(SCL)连接到I2C总线。允许连接到标准(最高100kHz)或快速(最高400kHz)的I2C总线。1.I2C的4种模式● 从设备发送模式● 从设备接收模式● 主设备发送模式
发表于 2019-11-09
stm8s105调试I2C记录
最近由于AR项目中调试LCOS需要用到STM8S105的mcu,本次主要是使用模拟I2C。1.IIC协议简介 IIC协议这里只做简要介绍,详细介绍可以百度了解,协议相对简单,主要有开始位,停止位,应答位,非应答位。开始位:当时钟为高,数据线由高变低停止位:当时钟位高,数据线由低变高。应答位:第9个时钟到来时,数据线为低。(这里第9个时钟,发送完一个字节,紧接着就是第9个时钟到来)非应答位,第9个时钟到来时,数据线为高。2.LCOS协议:1.发送数据:单数据发送: 开始位:写地址位(8bit):寄存器地址(16bit):数据(8bit):停止位多字节发送:开始位:写地址(8bit):寄存器地址(16bit):数据(8bit
发表于 2019-11-09
stm8s105调试I2C记录
STM8S103之GPIO
如何快速了解GPIO,查看Reference manual中GPIO章节,初步了解到GPIOGPIO输入分为:Floating Input和Input with pull-upGPIO输出分为:Open drain和pull-up(且pull-up时速率可以设置)GPIO复用功能如何选择,复用功能分为:Default alternate function和Alternate function after remap [optionbit]其中remap得知参考STM8S103的datasheet中的Option bytes,STM8S103中的Option bytes可以设置时钟,IO口的复用选择
发表于 2019-11-09
STM8S103之GPIO
STM8S MAX7219点阵模块驱动芯片程序
以下为.h文件:#ifndef __MAX7219_H#define __MAX7219_H#include "stm8s_gpio.h"#include "stm8s.h"#include <iostm8s103f3.h>#include <intrinsics.h>#include "tim1.h" #define uchar unsigned char#define uint  unsigned int#define count 8  void Init_MAX7219(void);void
发表于 2019-11-08
STM8S MAX7219点阵模块驱动芯片程序
STM8L051F3_01_GPIO应用
本章介绍STM8L051F3的GPIO相关知识。内容分为以下几部分:GPIO简介点亮LED1、GPIO简介GPIO:通用输入/输出口,用于芯片与外部进行数据传输;STM8L051F3的一个I/O端口最多可以有8个Pins(引脚),每个引脚可以独立地配置为数字输入或数字输出。此外,一些I/O端口可能有一些复用功能如模拟输入、外部中断、片上外设的输入输出等,一个引脚不能同时使用多种复用功能。每个I/O端口都分配有一个输出数据寄存器、输入数据寄存器、数据方向寄存器、两个配置寄存器,一个I/O端口工作在输入或输出状态取决于数据方向寄存器。STM8L051F3的GPIO主要性能如下:端口的位(引脚)能独立配置可选择的输入模式:浮空输入
发表于 2019-11-13
小广播
何立民专栏 单片机及嵌入式宝典

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

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