历史上的今天
返回首页

历史上的今天

今天是:2025年03月04日(星期二)

正在发生

2020年03月04日 | 【菜鸟入门】stm32 之 iic

2020-03-04 来源:eefocus

纠结了两天,终于重新开始写了,这两天一直卡在硬件iic上,由于硬件iic是比较难啃的一块骨头,问题一大堆,明明感觉配置好,测试时,一会出这个问题,一会出那个问题,哎,说多了都是泪。。。。


最后木有办法了,总不能吊死在一棵树上吧,然后就写了个模拟的iic的,由于对iic研究和应用的比较多(我们实验室的设备都是iic通信的,所有设备的驱动都是我来写的),所以在搞这个的时候得心应手,一个小时就把所有的搞定了,有花了1个小时把eeprom(at24c02)调通;


我大致测了下,我的板子上的eeprom电路类似这个:

所以我要做的是就是把PB6配置称时钟线SCL,PB7配置成数据线SDA


这里我们再配置输出的时候,要把管脚配置成 General purpose output push-pull模式,具体原因看datasheet关于管脚配置的那章口头,说的很清楚;


先给大家看看我的头文件里面的定义


#ifndef __IIC_H__

#define __IIC_H__

#define INPUT 0x8

#define OUTPUT 0x3

 

/* Config GPIOx */

#define IIC GPIOB

#define SCL_BIT 6

#define SDA_BIT 7

 

/*Set & Get GPIOx Value*/

#define SET_SDA(a) do{

if(a) IIC->ODR |= 1< else IIC->ODR &= ~(1< }while(0)

#define SET_SCL(a)  do{

if(a) IIC->ODR |= 1< else  IIC->ODR &= ~(1< }while(0)

 

#define SDA_OUT do{

IIC->CRL &= ~((unsigned int)0xf<<(4*SDA_BIT));

IIC->CRL |= (unsigned int)OUTPUT<<(4*SDA_BIT);

}while(0)

#define SDA_IN do{

IIC->CRL &=  ~((unsigned int)0xf<<(4*SDA_BIT));

IIC->CRL |= (unsigned int)INPUT<<(4*SDA_BIT);

}while(0)

#define SDA_VAL (IIC->IDR&(1<#define SDA_H SET_SDA(1)

#define SDA_L SET_SDA(0)

#define SCL_H SET_SCL(1)

#define SCL_L SET_SCL(0)

#define DELAY delay_us(10)

 

 

#define SLAVE_ADDR 0xA0

#define IIC_READ 0x01

#define IIC_WRITE 0x00

 

extern int iic_init(void);

extern void iic_start(void);

extern void iic_stop(void);

extern void iic_send_ack(unsigned char ack);

extern unsigned char iic_recv_ack(void);

extern void iic_send(unsigned char bit);

extern unsigned char iic_send_byte(unsigned char dat);

extern unsigned char iic_recv(void);

extern unsigned char iic_recv_byte(void);

extern int iic_send_str(char str[],int len);

extern void iic_recv_str(char str[],int len);

 

#endif


下面是iic的应用函数


#include

#include "init.h"

#include "iic.h"

/*

SCL   PB6     

SDA   PB7

 */

 

 

int iic_init()

{

RCC->APB2ENR |= 1<<3; //Set Clock for GPIOB

IIC->CRL &= ~((unsigned int)0xf<<(4*SCL_BIT));

IIC->CRL |= (unsigned int)OUTPUT<<(4*SCL_BIT); //config scl

IIC->CRL &= ~((unsigned int)0xf<<(4*SDA_BIT));

IIC->CRL |= (unsigned int)OUTPUT<<(4*SDA_BIT); //config sda

return 1;

}

 

void delay5us()

{

  DELAY;

}

 

/* iic start */

void iic_start()

{

    SDA_OUT;

    SCL_H;

    SDA_H;DELAY;

    SDA_L;DELAY;

    SCL_L;

}

/* iic stop */

void iic_stop()

{

    SDA_OUT;

SCL_L;SDA_L;

    SCL_H;DELAY;

    SDA_H;DELAY;

}

/* 

 * iic send ack

 * ack (0:ACK 1:NAK)

 */

void iic_send_ack(unsigned char ack)

{

    SDA_OUT;SCL_L;

    if(ack == 0x00) SDA_L;

    if(ack == 0x01) SDA_H;

    DELAY;

    SCL_H;DELAY;

    SCL_L;DELAY;

}

/* receive ack */

unsigned char iic_recv_ack()

{

    u32 val = 0;

    SDA_IN;

    SCL_H;DELAY;

    val = SDA_VAL;

    SCL_L;DELAY;

    return (val!=0 ? 1:0);

}

 

/* send one bit*/

void iic_send(unsigned char bit)

{

    SCL_L;

    if(bit == 0x01) SDA_H;

    else            SDA_L;

    DELAY;

    SCL_H;DELAY;

    SCL_L;DELAY;

}

/* send one byte */

unsigned char iic_send_byte(unsigned char dat)

{

unsigned char i = 0;

    SDA_OUT;

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

    {

      if(dat & 0x80) iic_send(0x01);

      else         iic_send(0x00);

      dat <<= 1;

    }

    return 1;

}

/* iic receive bit */

unsigned char iic_recv()

{

    u32 bit = 0;

    SCL_L;

    SCL_H;DELAY;

    bit = SDA_VAL; 

    SCL_L;DELAY;

    

    return (bit!=0 ? 1:0);

}

/* iic receive byte */

unsigned char iic_recv_byte()

{

    unsigned char i;

    unsigned char dat = 0;

    SDA_IN;

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

    {   

      dat <<= 1;

      dat |= iic_recv();

        

    }

    return dat;

}

int iic_send_str(char str[],int len)

{

int i=0;

for(i=0; i {

iic_send_byte(str[i]);

if(iic_recv_ack())

return i;

}

return len;

}

void iic_recv_str(char str[],int len)

{

int i=0;

for(i=0; i {

str[i]=iic_recv_byte();

iic_send_ack(0);

}

str[i] = '';

}

推荐阅读

史海拾趣

AF International公司的发展小趣事

随着公司业务规模的不断扩大,AF International意识到建立完善的质量管理体系至关重要。公司引进了先进的质量管理理念和方法,建立了严格的质量控制流程,确保从原材料采购到产品生产的每一个环节都符合质量标准。同时,AF International还加强了对员工的培训和教育,提高员工的质量意识和操作技能。这些措施使得公司的产品质量得到了有效保障,赢得了客户的广泛赞誉。

Connection One公司的发展小趣事

在电子行业的初期,Connection One公司凭借其创始人对半导体技术的深刻理解,成功研发出一款具有划时代意义的芯片。这款芯片不仅性能卓越,而且功耗极低,立即在市场上引起了轰动。公司因此迅速积累了第一笔资金,为后续的研发和扩展打下了坚实基础。

DESIGNERSYSTEMS公司的发展小趣事

DESIGNERSYSTEMS公司的创始人在电子行业有着深厚的背景和独特的见解。他们发现市场上缺乏一种能够集成多种功能、高度定制化的电子设备设计解决方案。于是,他们创立了DESIGNERSYSTEMS,专注于提供从概念到原型再到量产的全方位设计服务。通过不断的技术创新和对市场需求的精准把握,DESIGNERSYSTEMS迅速在电子行业树立了自己的品牌形象,赢得了客户的信赖。

EFC [Electronic Film Capacitors, Inc.]公司的发展小趣事

随着公司规模的扩大和实力的增强,EFC公司开始将目光投向国际市场。他们积极参加各种国际展会和交流活动,与全球各地的客户和合作伙伴建立了广泛的联系。同时,EFC还根据不同国家和地区的市场需求,推出定制化的产品和服务。这种灵活多变的市场策略使EFC在国际市场上迅速崛起。

First Switchtech公司的发展小趣事

随着物联网、智能家居等新兴技术的兴起,First Switchtech公司(或类似公司)看到了跨界合作的新机遇。公司积极与智能家居厂商、物联网平台等合作伙伴开展深度合作,共同研发具有创新性的智能开关产品。这些产品不仅实现了开关的远程控制、智能联动等功能,还为用户提供了更加便捷、舒适的智能生活体验。通过跨界合作,First Switchtech公司成功拓展了业务领域,并在智能家居市场中占据了重要位置。

CINCH公司的发展小趣事

随着业务的不断发展,CINCH公司开始寻求市场拓展和战略合作的机会。公司积极与国内外知名企业建立合作关系,共同开发新产品、拓展新市场。同时,CINCH公司还加强了对新兴市场的关注,通过参加国际展会、举办技术研讨会等方式,提升品牌知名度和影响力。这些举措有效地推动了公司的市场拓展和业务发展。

问答坊 | AI 解惑

基于AT89C52单片机的SD卡的读写设计

长期以来,以Flash Memory为存储体的SD卡因具备体积小、功耗低、可擦写以及非易失性等特点而被广泛应用于消费类电子产品中。特别是近年来,随着价格不断下降且存储容量不断提高,它的应用范围日益增广。当数据采集系统需要长时间地采集、记录海量数 ...…

查看全部问答>

想请问:我的汇编文件编译连接后,为什么没有写到我指定的地址

如果程序中即有C代码,又有汇编代码,那汇编代码编译连接后,会被放到物理地址的什么地址,这个由哪里的设置决定 在keil的options里设置的片内FLASH 我的片内FLASH起始地址为:0xC00000 编译后C代码都写到这里了,可是汇编的代码却写到0x000A6A ...…

查看全部问答>

ucos中的OSUnMapTbl原理在硬件中的应用?

ucos中的OSUnMapTbl是一个很大的静态数组,提高查找速度 以前看过一个网页说 这中设计思想在硬件设计中也有应用,固化在芯片中什么的, 烦请请高手指点一下。…

查看全部问答>

我的独立看门狗总结,请批评更正!(30楼窗口看门狗总结)

一、独立看门狗IWDG概述 1.)看门狗设备(独立看门狗和窗口看门狗)可用来检测和解决由软件错误引起的故障;当计数器达到给定的超时值时,触发一个中断或产生系统复位。2.)功能图:(由于本人无法贴图,请见参考手册,125页) 3 ...…

查看全部问答>

求分析关于1602的几行程序

以下是程序中有?号的行不懂?请高手帮忙解答,灰常感谢~               /*******************************************函数名称:LocateXY功    能:向液晶输入显示字符位置的坐标信 ...…

查看全部问答>

既然有ADS这个工具,为什么还要学GCC啊?

如题,做ARM-LINUX 嵌入式开发,不是有ADS这个工具嘛,在WINDOWS 环境下,用ADS这个编译工具,写完并且编译好需要下载到开发板中的程序,然后,还能用AXD这个工具进行在线调试开发板,这是不是就够了呢。 那为什么还需要在LINUX环境中,比如RED HA ...…

查看全部问答>

求帮助设计一个关于电梯运行的控制电路

一个四层楼的建筑,两个电梯:电梯1和电梯2要求:1,当处于某层的一个人按动“呼叫”命令时,距离他较近的电梯到来;           2,如果两个电梯和这个人距离一样,则“电梯1”到来        &nbs ...…

查看全部问答>

430F169AD采样工作有间断期

#include #define   Num_of_Results   8 uint ADC_BUF0[Num_of_Results]; uint ADC_BUF1[Num_of_Results]; uint sumI;            //定义电流采样均值 uint sumV;    ...…

查看全部问答>

msp430 STM32 STM8 CC2500开发板及仿真器等一批!!甩卖~~

亲们,工作有一段时间了,有一批板子老是带在身边不方便。。。甩卖了!!!有需要的联系qq 1556857003 手机就不留了~~ 各种板子,如果没有亲们要的,就捧个热场~~ 所有板子的资料配件均齐全,拍下后可以网传。。。 支付宝交易。。。 不知道为什 ...…

查看全部问答>

开发板

   瑞萨开发板买不到怎么办??????????、 …

查看全部问答>