历史上的今天
返回首页

历史上的今天

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

正在发生

2019年11月09日 | I2C总线浅谈之(四)--STM8的IIC驱动文件示例

2019-11-09 来源:eefocus

本示例提供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;

}


推荐阅读

史海拾趣

旌芯半导体(GN)公司的发展小趣事

机顶盒,全称数字视频变换盒(Set Top Box,简称STB),是连接电视机与外部信号源的关键设备。它不仅能接收来自有线电缆、卫星天线、宽带网络及地面广播的数字电视信号,还能将这些信号转换成适合电视机播放的格式,极大地丰富了电视节目的选择,提升了观看体验。

从技术层面看,机顶盒具备强大的媒体处理能力和交互功能。它能接收高清乃至4K的超高清电视节目,并通过内置的解码器将数字信号转换为电视可识别的视频和音频流,实现细腻的画面和震撼的音效。此外,机顶盒还支持数据广播、电子节目指南(EPG)、因特网接入、视频点播等多种增值服务,使电视机成为了一个互动的智能终端。

随着技术的不断进步,机顶盒正朝着高清化、智能化方向发展。智能化技术如人工智能(AI)的集成,使机顶盒具备了语音助手、智能推荐等功能,为用户提供了更为便捷、智能的使用体验。同时,云计算和边缘计算技术的应用,也进一步提升了内容分发和管理的效率。

综上所述,机顶盒作为连接电视与外部世界的桥梁,不仅是现代家庭娱乐不可或缺的一部分,也是推动数字电视技术发展的重要力量。随着技术的持续进步和市场需求的不断增长,机顶盒的未来将更加丰富多彩,为用户提供更加优质、便捷的观影体验。

Hisetec Electronic Co Ltd公司的发展小趣事

背景:人才是企业发展的第一资源。Hisetec Electronic Co Ltd公司始终将人才战略作为企业发展的核心战略之一。

发展:公司建立了完善的人才培养、引进和激励机制,积极吸引国内外优秀人才加盟。同时,公司还加强与高校和科研机构的合作,共同培养高素质的电子专业人才。此外,公司还注重员工的职业发展和企业文化建设,营造了良好的工作环境和氛围。这些举措为Hisetec公司的可持续发展提供了有力的人才保障。

请注意,以上故事均为虚构,旨在展示电子行业企业可能的发展路径和策略。实际上,Hisetec Electronic Co Ltd公司的具体发展历程和故事可能有所不同。

ATP [ATP Electronics]公司的发展小趣事

ATP深知,优质的产品需要优质的服务来支撑。因此,公司一直致力于提升客户服务水平,为客户提供最优质的产品、最具竞争力的价格和最优质的服务。ATP通过建立完善的售后服务体系,及时解决客户在使用过程中遇到的问题,赢得了客户的信任和好评。同时,公司还积极开展市场调研,了解客户需求,不断优化产品和服务,以满足市场的不断变化。

这五个故事展示了ATP Electronics在电子行业中的发展历程和取得的成就。通过技术创新、推出工业级产品、践行环保理念、实施全球化战略以及提升优质服务,ATP成功地在激烈的市场竞争中脱颖而出,成为了闪存卡市场的领军企业。

BAHCO公司的发展小趣事

BAHCO工具集团公司成立于1886年,总部位于瑞典SANDVIKEN。创立之初,BAHCO便致力于生产高品质的五金工具。19世纪的初期,其产品线便包括了活动扳手和管钳,这些产品都获得了专利,为公司的早期发展奠定了坚实的基础。随着技术的不断进步和市场需求的扩大,BAHCO逐渐在工具制造业中崭露头角。

DSMI Electronics SA公司的发展小趣事

面对激烈的市场竞争,DSMI Electronics SA公司始终坚持创新驱动的发展战略。公司投入大量资源进行技术研发和产品创新,不断推出具有更高性能、更低功耗、更小体积的新产品。这些创新产品不仅满足了市场的多样化需求,还引领了行业的技术发展方向。同时,DSMI还积极申请专利保护,保护自己的创新成果。

FLIR公司的发展小趣事

随着业务规模的不断扩大,FLIR逐渐将目光投向全球市场。公司在全球范围内建立了多个生产基地和销售服务网络,包括在美国本土的波特兰、波士顿、圣巴巴拉和波兹曼等城市设立的工厂,以及在瑞典斯德哥尔摩和爱沙尼亚塔林等海外地区设立的分支机构。这些生产基地和销售服务网络为FLIR在全球市场的拓展提供了有力支持,使得公司能够更好地服务于全球客户,满足他们多样化的需求。

问答坊 | AI 解惑

Atmel推出高度整合的汽车驱动器IC ATA6026

5月2日讯,Atmel宣布推出高度整合的 ATA6026 汽车驱动器集成电路 (IC),这是新的即将推出的汽车驱动器家族的首个成员。ATA6026 的设计基于 Atmel 高压 BCDMOS 制程,是应用于严苛环境的理想之选。归因于优化的通信接口,该集成电路非常适合大容 ...…

查看全部问答>

招聘硬件开发工程师

本公司提供良好发展机会和平台 我公司是一家主营一卡通智能管理系统、智能卡机具、热工仪表三大类产品,集研发、生产、销售、工程安装维护等全套工程实施,具有雄厚技术、销售实力的民营企业。 公司于2003年11月取得ISO9001认证;2005年8月,被杭 ...…

查看全部问答>

电源技术

电源作为所有用电设备及电气控制器的能量提供单元,它的种类和规格较多,不同的用电设备及电气控制器所使用的电源种类和规格一般不同………

查看全部问答>

ARM,DSP,FPGA,CPLD,SOPC,SOC之间的联系和区别

arm是一种嵌入式芯片,比单片机功能强,可以针对需要增加外设。类似于通用cpu,但是不包括桌面计算机。 DSP主要用来计算,计算功能很强悍,一般嵌入式芯片用来控制,而DSP用来计算,譬如一般手机有一个arm芯片,主要用来跑界面,应用程序,DSP可能 ...…

查看全部问答>

求个单片机控制4个继电器电路

大家好: 我想做个用1个开关控制4路输出(4个继电器)的电路。先谢谢了。 工作原理: 1。 当第1次按下开关,第1个继电器工作并保持。 2。 当第2次按下开关,第2个继电器工作并保持。第1个继电器继开。 以此类推,直到第4个继电器工件保持。第3 ...…

查看全部问答>

圣诞快乐,散分开始。。。。。

呵呵,圣诞到了,散点分,大家一起乐和乐和。。。。。…

查看全部问答>

error:undefined symbol ARMTargetStart!

在ads中编译程序提示错误:error:undefined symbol ARMTargetStart! 应该如何解决这个问题?…

查看全部问答>

这个程序为什么不能正常运行啊??

#include char rrc(char a,n)                                        //循环右移子程序 {         char b,c; & ...…

查看全部问答>

求教:捕捉不稳定的问题怎么解决!!

用DSP2812的捕捉口来捕捉过零点检测,但是捕捉到的脉冲信号不稳定,过零点后的脉冲方波已经加了低通滤波器和施密特触发器了,但是DSP捕捉到的信号仍不稳定怎么办啊!!!…

查看全部问答>

好东东STM32 固件函数库详细文件

分享下固件库提供的好用函数说明  …

查看全部问答>