I2C总线浅谈之(四)--STM8的IIC驱动文件示例

2019-11-09来源: eefocus关键字:I2C总线  STM8  IIC驱动

本示例提供STM8S103F核心板的IIC驱动文件源代码,亲测没有任何问题,博主使用来驱动AT24C256和电子罗盘MMC5883MA,IIC通信速率100kHz,可以调整时序延时时间。


直接贴源码:


IIC.h


#ifndef _IIC_H

#define _IIC_H

 

#include "iostm8s103F3.h"

#include "type_def.h"

 

#define IIC_SCL          PC_ODR_ODR5           //设置SCL为GPIO--PC5

#define IIC_SDA          PC_ODR_ODR6           //设置SDA为GPIO--PC6

#define READ_SDA         PC_IDR_IDR6   //PC6引脚为输入寄存器

#define SET_SCL_OUT()    {PC_DDR_DDR5=1; PC_CR1_C15 = 1; PC_CR2_C25 = 0;}//设置SCL引脚为推挽输出模式

#define SET_SDA_OUT()    {PC_DDR_DDR6=1; PC_CR1_C16 = 1; PC_CR2_C26 = 0;}//设置SDA引脚为推挽输出模式

#define SET_SDA_IN()     {PC_DDR_DDR6=0; PC_CR1_C16 = 0; PC_CR2_C26 = 0;}//设置SDA引脚为输入模式

 

//IIC所有操作函数

void IIC_Init(void);                 //初始化IIC的IO口  

void IIC_Start(void); //发送IIC开始信号

void IIC_Stop(void);   //发送IIC停止信号

void IIC_Send_Byte(unsigned char txd); //IIC发送一个字节

uint8_t IIC_Read_Byte(unsigned char ack); //IIC读取一个字节

uint8_t IIC_Wait_Ack(void); //IIC等待ACK信号

void IIC_Ack(void); //IIC发送ACK信号

void IIC_Nack(void); //IIC不发送ACK信号

 

#endif



IIC.c


#include "IIC.h"

#include "delay.h"

 

//初始化IIC

void IIC_Init(void)

{

    SET_SCL_OUT();//设置SCL引脚为推挽输出模式

    SET_SDA_OUT();//设置SDA引脚为推挽输出模式

IIC_SCL = 1;//IIC总线SDA与SCL同时置高,总线为空闲状态

IIC_SDA = 1;

}

 

//产生IIC起始信号

void IIC_Start(void)

{

SET_SDA_OUT();//设置SDA引脚为推挽输出模式

IIC_SDA = 1;//开始前IIC总线SDA与SCL同时置高,总线为空闲状态,做通信准备    

IIC_SCL = 1;

delay_4us();

  IIC_SDA = 0;//在SCL为高期间,SDA由高到低的跳变,启动信号发出

delay_4us();

IIC_SCL = 0;//SCL拉低钳住I2C总线,准备发送或接收数据 

delay_2us();

}

 

//产生IIC停止信号

void IIC_Stop(void)

{

SET_SDA_OUT();//设置SDA引脚为推挽输出模式

IIC_SCL = 0;//通信结束,SCL,SDA都为低。

IIC_SDA = 0;

  delay_4us();

IIC_SCL = 1;//将SCL置高,当SCL为高期间,SDA由低到高的跳变

IIC_SDA = 1;//发送I2C总线结束信号

delay_4us();  

}

//等待应答信号到来

//返回值:1,接收应答失败

//        0,接收应答成功

uint8_t IIC_Wait_Ack(void)

{

uint8_t ucErrTime = 0;

IIC_SDA = 1;

    delay_us();

IIC_SCL = 1;

    delay_us();

SET_SDA_IN();//SDA设置为输入

delay_us();

while(READ_SDA)

{

ucErrTime++;

if(ucErrTime>250)

{

IIC_Stop();

return 1;

}

}

IIC_SCL=0;//时钟SCL输出0   

return 0;  

//产生ACK应答

void IIC_Ack(void)

{

IIC_SCL = 0;

SET_SDA_OUT();

IIC_SDA = 0;

delay_2us();

IIC_SCL = 1;

delay_2us();

IIC_SCL = 0;

}

//不产生ACK应答    

void IIC_Nack(void)

{

IIC_SCL = 0;

SET_SDA_OUT();

IIC_SDA = 1;

delay_2us();

IIC_SCL = 1;

delay_2us();

IIC_SCL = 0;

}     

//IIC发送一个字节

//返回从机有无应答

//1,有应答

//0,无应答  

void IIC_Send_Byte(uint8_t txd)

{                        

    uint8_t t;   

SET_SDA_OUT(); //设置SDA引脚为推挽输出模式    

    IIC_SCL = 0;//拉低时钟SCL开始数据传输

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

    {   

        if((txd & 0x80) >> 7)//发送最高位

        {

            IIC_SDA = 1;

        }

        else

        {

            IIC_SDA = 0;

        }

 

        txd <<= 1; //移位处理  

delay_2us();//对特殊IC这三个延时都是必须的//6us,频率166khz

IIC_SCL = 1;

delay_2us(); 

IIC_SCL = 0;

delay_2us();

    }  

}    

//读1个字节,ack=1时,发送ACK,ack=0,发送nACK   

uint8_t IIC_Read_Byte(unsigned char ack)

{

unsigned char i,receive=0;

SET_SDA_IN();//SDA设置为输入

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

{

        IIC_SCL = 0; 

        delay_2us();

IIC_SCL = 1;

        receive<<=1;

        if(READ_SDA)

        {

            receive++; 

        }

delay_us(); 

    }  

    if (!ack)

    {

        IIC_Nack();//发送nACK

    }

    else

    {

        IIC_Ack(); //发送ACK 

    }

    return receive;

}


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

上一篇:STM8硬件I2C配置
下一篇:STM8S_010_I2C读写EEPROM(硬件方式)

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

推荐阅读

AVR单片机I2C总线程序
#include "iom16v.h"/*I2C总线主机模式错误处理*/void error(unsigned char type) {        switch (type & 0xF8) {                case 0x20:                                 
发表于 2019-10-15
I2C总线详解笔记
1. 引言I2C总线是事实上的世界标准,现在由超过50家公司制造的1000多种不同的IC实现。此外,多功能I2C总线用于各种控制架构,如系统管理总线(SMBus),电源管理总线(PMBus),智能平台管理接口(IPMI),显示数据通道(DDC)和高级电信计算架构(ATCA))。在消费者电子电讯和工业电子中看上去不相关的设计里经常有很多相似的地方例如几乎每个系统都包括:为了使这些相似之处对系统设计者和器件厂商都得益而且使硬件效益最大电路最简单Philips (现NXP)开发了一个简单的双向两线总线实现有效的IC 之间控制这个总线就称为Inter IC 或I2C 总线。所有符合I2C总线的器件组合了一个片上接口使器件之间直接通过I2C
发表于 2019-09-12
I2C总线详解笔记
SPI I2C 的原理及在STM32上使用I2C总线的常见问题
在微控制器中SPI,I2C是常用的挂接外设的总线,我们对他们的如果没有仔细研究的话我们对他们的认识基本就是串行,线少(I2C两根SCL SDA,SPI 单向3根双向4根 SCK MOSI MISO CS/LD ),多外设(SPI 可以并联也可以级联,I2C基本是随便接,地址不冲突即可),但是实际上这两种总线原理上还有有很大区别的,在微控制器上的操作及与程序控制流程也是完全不一样的。SPI的原理 是主控使用SCLK 线,在SCLK信号的边沿 将数据寄存器的数据通过 MOSI一位一位的移出到 设备中 ,同时设备的寄存器也将数据在SCLK边沿的驱动下将数据通过MISO线一位一位的移出到主控中,所以SPI总线中读写是同时进行的,没有单独
发表于 2019-09-03
初学24CXX系列EEPROM使用详解&STM32库函数I2C总线
I2C总线上可以连接的同一型号的器件数量。如24C01/02可以接8个,而24C16在同一个I2C总线上只能接1个器件;功能2:引脚功能位P8、P9和P10时(黄色标注部分),其代表的是数据帧地址。刚才已经说了,24C04存储容量有512Byte,使用8位地址数据寻址只能寻址256位,这里其A0引脚的功能就是数据地址位的第9位,这样其实际寻址功能为2^9=512,24C08和24C16也同理。所以在操作24C04/08/16器件时,如果要使用全部的存储空间,相应P8、P9或P10引脚应单独使用IO控制。遇到的问题:在实际操作中使用STM32的I2C总线读写24CXX系列EEPROM时,遇到很多问题,陆陆续续学习了好几天,才一一解决。主要
发表于 2019-08-12
轻松学ARM系列之I2C总线
今天我们来一起学习,arm裸机中对I2C设备学习。包括GPIO,IIC控制器学习。一、总体架构图二、I2C操作的一般步骤2.1  查看s5pv210开发板的I2C相关的硬件原理图开发板上IIC实际连接电路,AT24C02为EEPROM,大小为2k位,256字节核心板对应的原理图2.2  设置GPIO寄存器为I2C功能配置GPD1CON[0] 和 GPD1CON[1] 为I2C 功能:GPDCON.GPD1CON = (GPDCON.GPD1CON & (~0xff))| 0x222.3 查看I2C控制器相应的章节,对相关的寄存器进行配置选择设备的发送方式,主发射,从接收模式(这个是由从设备自动决定
发表于 2019-08-10
轻松学ARM系列之I2C总线
STM8L低功耗调试总结
STM8L低功耗调试资料准备功耗数据目标实现低功耗资料准备在调试STM单片机相关功能时,习惯性的进入到STM官方论坛进行资料下载。调试STM8功耗也不例外,找到STM8L的应用笔记,选择最热,先看看官方提供的STM8入门文档,入门资料可以选择中文或者英文(STM8L和STM8AL入门)。资料里面有一段话,对功耗调试相当重要:6.6 不使用的 I/O 和特性微控制器都是为多种应用设计的,通常一个应用不会使用 100 % 的微控制器资源。为了避免不必要的功率消耗 (对电池供电应用特别重要),同时提高 EMC 性能,闲置时钟、计数器或 I/O 都不应浮空。 I/O 应该外部强制 (上拉或者下拉到闲置 I/O 引脚),并且不使用的功能应
发表于 2019-11-14
STM8L低功耗调试总结
小广播
何立民专栏 单片机及嵌入式宝典

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

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