历史上的今天
返回首页

历史上的今天

今天是:2025年08月07日(星期四)

正在发生

2019年08月07日 | stm32 hal 模拟i2c

2019-08-07 来源:eefocus

管脚配置(我是用的是PA9和PA10):


//i2c.h

#include "stm32f0xx_hal.h"

 

#define GPIO_PORT_I2C GPIOA      // GPIO端口 

#define I2C_SCL_PIN SCL_Pin // 连接到SCL时钟线的GPIO 

#define I2C_SDA_PIN SDA_Pin // 连接到SDA数据线的GPIO 

 

 

/* 定义读写SCL和SDA的宏 */

#define I2C_SCL_1()  GPIO_PORT_I2C->BSRR = I2C_SCL_PIN // SCL = 1 

#define I2C_SCL_0()  GPIO_PORT_I2C->BSRR = (uint32_t)I2C_SCL_PIN << 16U  // SCL = 0 

 

#define I2C_SDA_1()  GPIO_PORT_I2C->BSRR = I2C_SDA_PIN    // SDA = 1 

#define I2C_SDA_0()  GPIO_PORT_I2C->BSRR = (uint32_t)I2C_SDA_PIN << 16U  // SDA = 0 

 

#define I2C_SDA_READ()  (GPIO_PORT_I2C->IDR & I2C_SDA_PIN) // 读SDA口线状态 

#define I2C_SCL_READ()  (GPIO_PORT_I2C->IDR & I2C_SCL_PIN) // 读SCL口线状态 

 

 

void i2c_Start(void);

//停止信号

void i2c_Stop(void);

//发送一个字节

void i2c_SendByte(uint8_t _ucByte);

//读取一个字节

uint8_t i2c_ReadByte(void);

//等待应答信号

uint8_t i2c_WaitAck(void);

//应答信号

void i2c_Ack(void);

//检查设备

uint8_t i2c_CheckDevice(uint8_t _Address);

//发送数据

void  Device_WriteData(uint8_t DeciveAddr,uint8_t *Data,int size);

//i2c.c

#include "i2c.h"

#include "main.h"

 

static void i2c_Delay(void)

{

uint8_t i;

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

}

//开始信号

void i2c_Start(void)

{

// 当SCL高电平时,SDA出现一个下跳沿表示I2C总线启动信号 

I2C_SDA_1();

I2C_SCL_1();

i2c_Delay();

I2C_SDA_0();

i2c_Delay();

I2C_SCL_0();

i2c_Delay();

}

 

//停止信号

void i2c_Stop(void)

{

// 当SCL高电平时,SDA出现一个上跳沿表示I2C总线停止信号 

I2C_SDA_0();

I2C_SCL_1();

i2c_Delay();

I2C_SDA_1();

i2c_Delay();

}

//发送一个字节

void i2c_SendByte(uint8_t _ucByte)

{

uint8_t i;

// 先发送字节的高位bit7 

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

{

if (_ucByte & 0x80)

{

I2C_SDA_1();

}

else

{

I2C_SDA_0();

}

i2c_Delay();

I2C_SCL_1();

i2c_Delay();

I2C_SCL_0();

if (i == 7)

{

I2C_SDA_1(); // 释放总线

}

_ucByte <<= 1; // 左移一个bit 

i2c_Delay();

}

}

//读取一个字节

uint8_t i2c_ReadByte(void)

{

uint8_t i;

uint8_t value;

/* 读到第1个bit为数据的bit7 */

value = 0;

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

{

value <<= 1;

I2C_SCL_1();

i2c_Delay();

if (I2C_SDA_READ())

{

value++;

}

I2C_SCL_0();

i2c_Delay();

}

return value;

}

 

//等待应答信号

uint8_t i2c_WaitAck(void)

{

uint8_t re;

 

I2C_SDA_1(); /* CPU释放SDA总线 */

// i2c_Delay();

I2C_SCL_1(); /* CPU驱动SCL = 1, 此时器件会返回ACK应答 */

i2c_Delay();

 

if (I2C_SDA_READ()) /* CPU读取SDA口线状态 */

{

re = 1;

}

else

{

re = 0;

}

 

I2C_SCL_0();

i2c_Delay();

return re;

}

//应答信号

void i2c_Ack(void)

{

I2C_SDA_0(); /* CPU驱动SDA = 0 */

i2c_Delay();

I2C_SCL_1(); /* CPU产生1个时钟 */

i2c_Delay();

I2C_SCL_0();

i2c_Delay();

I2C_SDA_1(); /* CPU释放SDA总线 */

}

 

 

uint8_t i2c_CheckDevice(uint8_t _Address)

{

uint8_t ucAck;

 

if (I2C_SDA_READ() && I2C_SCL_READ())

{

i2c_Start(); /* 发送启动信号 */

 

/* 发送设备地址+读写控制bit(0 = w, 1 = r) bit7 先传 */

i2c_SendByte(_Address | 0);

ucAck = i2c_WaitAck(); /* 检测设备的ACK应答 */

 

i2c_Stop(); /* 发送停止信号 */

 

return ucAck;

}

return 1; /* I2C总线异常 */

}

 

 

void  Device_WriteData(uint8_t DeciveAddr,uint8_t *Data,int size)

{

    int count=size;

uint8_t *pData=Data;

//起始信号

    i2c_Start();    

    //发送器件地址                         

    i2c_SendByte(DeciveAddr);       

    //等待应答

    i2c_WaitAck();                          

    while(count--)

{

//发送数据

i2c_SendByte(*pData++);                     

//等待应答

i2c_WaitAck();   

}  

                       

    //结束信号

    i2c_Stop();     

}


推荐阅读

史海拾趣

Formosa MS公司的发展小趣事

在电子行业,Formosa MS(美丽微半导体股份有限公司)的发展过程中,有几个关键的故事可以体现其成长历程。以下是根据公开信息整理的五个相关故事:

1. 创立与初期发展

Formosa MS成立于民国八十五年七月(即1996年),由杨照霞女士创办。公司初期便确立了“新速勤俭、创造利润、热诚信义、前瞻未来”的经营理念,致力于在二极管领域进行创新。在整流二极管逐渐转移至中国大陆生产的背景下,Formosa MS选择专注于生产附加值较高的产品,如萧基二极管,这一战略决策为公司后续发展奠定了坚实基础。

2. 产品创新与多元化

随着技术的不断进步,Formosa MS不断推出新产品以满足市场需求。公司现有产品分类广泛,从0.1安培至三十安培的各类二极管均有产制,且产能规划每月超过200KK,涉及焊接、成型、测试等多个生产环节。此外,公司还实现了产品的多元化,包括一般、快速及超快速二极管等多种类型,进一步增强了市场竞争力。

3. 国际化布局

Formosa MS在发展过程中,积极拓展国际市场。公司的销售客户遍布全球,不仅服务于国内半导体制造商的OEM及中间电子零件贸易商,还通过自有品牌行销,赢得了世界各地客户的广泛好评。其应用类别涵盖通信、车用、AI及穿戴装置等多个领域,展现了公司在电子行业中的广泛影响力。

4. 品质至上与服务优先

Formosa MS始终将品质视为企业的生命线,坚持“品质至上、服务优先、顾客满意”的质量政策。公司严格遵循戴明博士的品质理念,致力于提供满足顾客需求的产品与服务。这种对品质的执着追求,使得Formosa MS在电子行业中树立了良好的口碑,赢得了客户的信赖与支持。

5. 应对行业变革与持续创新

面对电子行业的快速变革,Formosa MS始终保持敏锐的洞察力,积极应对市场变化。公司不断投入研发,推动技术创新,以适应行业发展的新趋势。同时,公司还注重人才培养和团队建设,为企业的持续发展提供了有力保障。正是凭借这种持续创新的精神和强大的团队实力,Formosa MS在电子行业中不断取得新的突破和发展。

需要注意的是,由于具体细节可能涉及公司内部的商业秘密,以上故事主要基于公开信息进行概括和整理。如需更详细的信息,建议直接访问Formosa MS的官方网站或查阅相关行业报告。

申风(everanalog)公司的发展小趣事

作为一家有社会责任感的企业,申风(everanalog)公司始终关注社会发展和环境保护问题。公司积极参与公益事业和环保活动,致力于为社会做出积极贡献。同时,公司也注重可持续发展战略的制定和实施,在生产经营过程中注重节能减排和资源循环利用等方面的工作。这些举措不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实的基础。

请注意,以上故事框架仅为示例,并未包含具体的细节和数据。如需了解更多关于申风(everanalog)公司的具体信息和发展历程,请查阅相关新闻报道或官方资料。

Good-Ark公司的发展小趣事
首先检查电源是否正常,包括电压是否稳定、电源插头是否接触良好等。
CUI公司的发展小趣事

随着环保意识的逐渐提升,电子行业开始寻求更加环保的CUI材料和生产工艺。一些公司投入大量研发资金,成功开发出低挥发性有机化合物(VOC)含量的CUI涂料,不仅降低了生产过程中的环境污染,还提高了产品的环保性能。

Andigilog公司的发展小趣事

近年来,智能化和物联网技术的快速发展为电子行业带来了前所未有的机遇。CUI技术作为实现电子设备智能化和互联互通的关键环节之一,得到了广泛的应用。一些企业针对智能化和物联网的需求,开发出具有特殊功能的CUI材料,如柔性CUI、透明CUI等,为电子产品的创新提供了有力支持。

请注意,以上故事仅为概述性质,并非针对特定公司的实际发展历程。每个公司的具体情况可能因市场环境、技术实力、管理策略等因素而有所不同。如果需要了解特定公司的具体发展故事,建议查阅相关公司的官方网站、新闻报道或行业分析报告。

国炬(GOOGLL)公司的发展小趣事
在制作功放时,需要确保中点电压接近0V。如果中点电压不为0V,需要进行调整,以避免引起功放输出的中点直流电压过大。

问答坊 | AI 解惑

8位、32位MCU整体研发成本比较

前言:在多数的微控器(MCU)应用中「成本」向来被视为第一设计要则,因此许多工程师倾向(或被要求)使用初阶MCU来精省成本,然这仅是精省了量产时的硬件料件成本,若从整体成本的角度来审视,结果往往会适得其反。 过去,微控器(MCU)的应用设计相 ...…

查看全部问答>

Protel DXP2004 简体中文破解版

Altium Protel DXP是第一套完整的板卡级设计系统,真正实现在单个应用程序中的集成。设计从一开始的目的就是为了支持整个设计过程,Protel DXP让你可以选择最适当的设计途径来按你想要的方式工作。Protel DXP PCB线路图设计系统完全利用了Windows X ...…

查看全部问答>

求助:电烙铁故障问题

开始用的时候可以,但是时间久了就不送锡了。 而且等锡融化时,把电烙铁头插入锡中,锡还保持着融合状态。 不知大家有没有好的办法解决?…

查看全部问答>

RS485通讯

  谁知道RS485通讯的详细资料???现在急用,谢谢!!!…

查看全部问答>

这个钟不错

http://www.tudou.com/programs/view/2dcGxif077E…

查看全部问答>

急 求破解!困惑了几个星期了!

为啥用msp430驱动不了呢?用51就可以呢?msp430用的是默认的时钟!各位帮帮忙啊! /**************宏定义***************/ #define DataDir0     P4DIR      //LCD1602 #define DataPort0    ...…

查看全部问答>

求问15pin oled的问题~~~~~

项目上要用到的 板子已经做好了 网上买了15pin的oled 中景园的 已经焊到板子上了~ oled 和接口如下图: 然后给大家看下淘宝卖家给提供的外围电路原理图: 那么问题来了 ~ 我现在外界电路已经按他给的图画好了 然后我用的mcu是430f5529 可 ...…

查看全部问答>

求 《STM32库开发实战指南》(刘火良 版)光盘资料 ?

本帖最后由 yhye2world 于 2016-10-27 15:11 编辑 见附图,为 《STM32库开发实战指南》(刘火良 版)封面截图。 请教: 哪位 有这本书的 光盘资料 呀 ?给小弟 共享下 ! 先谢谢了 ! …

查看全部问答>