历史上的今天
返回首页

历史上的今天

今天是:2025年04月02日(星期三)

正在发生

2019年04月02日 | STM32 模拟IIC完整代码

2019-04-02 来源:eefocus

void IIC_Init(void)

{      

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );

   

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOB, &GPIO_InitStructure);

 

IIC_SCL=1;

IIC_SDA=1;

 

}

//产生IIC起始信号

void IIC_Start(void)

{

SDA_OUT();     //sda线输出

IIC_SDA=1;     

IIC_SCL=1;

delay_us(4);

  IIC_SDA=0;//START:when CLK is high,DATA change form high to low 

delay_us(4);

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

}   

//产生IIC停止信号

void IIC_Stop(void)

{

SDA_OUT();//sda线输出

IIC_SCL=0;

IIC_SDA=0;//STOP:when CLK is high DATA change form low to high

  delay_us(4);

IIC_SCL=1; 

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

delay_us(4);    

}

//等待应答信号到来

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

//        0,接收应答成功

u8 IIC_Wait_Ack(void)

{

u8 ucErrTime=0;

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

IIC_SDA=1;delay_us(1);    

IIC_SCL=1;delay_us(1);  

while(READ_SDA)

{

ucErrTime++;

if(ucErrTime>250)

{

IIC_Stop();

return 1;

}

}

IIC_SCL=0;//时钟输出0    

return 0;  

//产生ACK应答

void IIC_Ack(void)

{

IIC_SCL=0;

SDA_OUT();

IIC_SDA=0;

delay_us(2);

IIC_SCL=1;

delay_us(2);

IIC_SCL=0;

}

//不产生ACK应答     

void IIC_NAck(void)

{

IIC_SCL=0;

SDA_OUT();

IIC_SDA=1;

delay_us(2);

IIC_SCL=1;

delay_us(2);

IIC_SCL=0;

}      

//IIC发送一个字节

//返回从机有无应答

//1,有应答

//0,无应答   

void IIC_Send_Byte(u8 txd)

{                        

    u8 t;   

SDA_OUT();     

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

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

    {              

        IIC_SDA=(txd&0x80)>>7;

        txd<<=1;   

delay_us(2);   //对TEA5767这三个延时都是必须的

IIC_SCL=1;

delay_us(2); 

IIC_SCL=0;

delay_us(2);

    }  

}     

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

u8 IIC_Read_Byte(unsigned char ack)

{

unsigned char i,receive=0;

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

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

{

    IIC_SCL=0; 

    delay_us(2);

IIC_SCL=1;

    receive<<=1;

    if(READ_SDA)receive++;   

delay_us(1); 

  }  

if (!ack)

IIC_NAck();//发送nACK

else

IIC_Ack(); //发送ACK   

return receive;

}

 

void I2C_WriteByte(uint16_t addr,uint8_t data,uint8_t device_addr)

{

IIC_Start();  


if(device_addr==0xA0) //eeprom地址大于1字节

IIC_Send_Byte(0xA0 + ((addr/256)<<1));//发送高地址

else

IIC_Send_Byte(device_addr);     //发器件地址

IIC_Wait_Ack(); 

IIC_Send_Byte(addr&0xFF);   //发送低地址

IIC_Wait_Ack(); 

IIC_Send_Byte(data);     //发送字节    

        IIC_Wait_Ack();         

        IIC_Stop();//产生一个停止条件 

if(device_addr==0xA0) //

delay_ms(10);

else

delay_us(2);

}

 

uint16_t I2C_ReadByte(uint16_t addr,uint8_t device_addr,uint8_t ByteNumToRead)  //读寄存器或读数据

{

uint16_t data;

IIC_Start();  

if(device_addr==0xA0)

IIC_Send_Byte(0xA0 + ((addr/256)<<1));

else

IIC_Send_Byte(device_addr);

IIC_Wait_Ack();

IIC_Send_Byte(addr&0xFF);   //发送低地址

IIC_Wait_Ack(); 

 

IIC_Start(); 

IIC_Send_Byte(device_addr+1);     //发器件地址

IIC_Wait_Ack();

if(ByteNumToRead == 1)//LM75温度数据为11bit

{

data=IIC_Read_Byte(0);

}

else

{

data=IIC_Read_Byte(1);

data=(data<<8)+IIC_Read_Byte(0);

}

IIC_Stop();//产生一个停止条件     

return data;

}


头文件


//使用IIC1 挂载M24C02,OLED,LM75AD,HT1382    PB6,PB7

 

#define SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}

#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}

 

//IO操作函数  

#define IIC_SCL    PBout(6) //SCL

#define IIC_SDA    PBout(7) //SDA  

#define READ_SDA   PBin(7)  //输入SDA 

 

//IIC所有操作函数

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

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

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

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

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

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

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

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

 

void I2C_WriteByte(uint16_t addr,uint8_t data,uint8_t device_addr);

uint16_t I2C_ReadByte(uint16_t addr,uint8_t device_addr,uint8_t ByteNumToRead);//寄存器地址,器件地址,要读的字节数 


下图为实际运行效果

推荐阅读

史海拾趣

富捷(FOJAN)公司的发展小趣事

自成立以来,富捷电子始终将技术创新视为企业发展的核心驱动力。公司投入巨资建立了一支国际专业的晶片电阻核心技术研发团队,专注于贴片电阻、合金电阻、车规电阻等产品的研发与生产。近年来,富捷电子成功研发出高端抗静电汽车晶片电阻FQS系列产品,并建设了“高端抗静电汽车晶片电阻智能工厂”,实现了从原材料入库到成品出库的全程智能化、自动化操作。这一创新不仅提升了产品性能,还满足了汽车电子行业对元件高可靠性、高稳定性的严格要求,推动了公司在汽车电子领域的快速发展。

BULGIN公司的发展小趣事

作为公认的环境密封连接器及元器件领先制造商,BULGIN公司一直专注于提升在环境密封、电源及防控产品领域的市场地位。公司凭借在极具挑战性的环境中提供可靠、坚固的电源、信号和数据连接的能力,赢得了客户的广泛赞誉。其中,备受欢迎的Buccaneer圆形连接器系列在业界享有出色的声誉,成为公司的一大亮点。

这五个故事展示了BULGIN公司在电子行业中的发展历程和关键里程碑。从创立初期到成为全球领先的电子零件制造商,再到战略性合并和业务扩展,BULGIN始终保持着创新精神和对优质产品的追求。如今,作为环境密封连接器及元器件的领先制造商,BULGIN将继续为客户提供卓越的产品和服务,推动电子行业的持续发展。

Aplus Integrated Circuits公司的发展小趣事

近年来,电子行业经历了多次技术变革和市场调整。面对这些挑战,Aplus Integrated Circuits公司积极调整战略,加大研发投入,推动产品创新。公司成功开发出多款适应市场需求的新型集成电路产品,不仅满足了客户的多样化需求,还为公司带来了可观的收益。

Feller US公司的发展小趣事

菲斯克(FSR.US)作为一家新兴的电动汽车制造商,自创立之初便面临着巨大的挑战。资金紧张是公司面临的首要问题,为了维持运营和推进研发,公司不得不频繁地寻求融资。在一次次的融资尝试中,菲斯克展现了其坚定的决心和创新的理念,虽然过程充满艰辛,但公司最终通过不断努力,成功获得了一笔重要的投资,为公司的发展奠定了坚实的基础。

BERGQUIST公司的发展小趣事

为了进一步提升竞争力,BERGQUIST公司开始寻求产业链整合和战略合作。公司与上游原材料供应商建立了长期稳定的合作关系,确保原材料的质量和供应稳定性。同时,公司还与下游电子设备制造商开展深度合作,共同研发定制化的热管理解决方案。这些举措不仅降低了公司的运营成本,还提高了产品的市场竞争力。

Fair Rite公司的发展小趣事

随着电子行业的快速发展,Fair Rite迅速捕捉到新的市场机遇。公司不断推出创新产品,以满足医疗、照明、汽车、通讯、航空、国防、智能能源和工业市场等领域的需求。Fair Rite通过技术创新和品质保证,赢得了客户的信赖和市场的认可。

问答坊 | AI 解惑

电磁兼容原理设计和预测技术

电磁兼容原理设计和预测技术 作    者: 蔡仁钢 I S B N: 7810126733 页    数: 240 开    本: 16开 封面形式: 简裝本 出 版 社: 北京航空航天大学出版社 出版日期: 1997-11-1 定    ...…

查看全部问答>

上海班库急招赴日嵌入式软件工程师和控制应用程序开发工程师

  上海班库急招赴日嵌入式软件工程师和控制应用程序开发工程师 班库猎头!www.intebankhr.com现在急招赴日嵌入式软件工程师和控制应用程序开发工程师 具体职位如下: 1 嵌入式软件工程师  SEレベル 必要な経験: 能力資格 ...…

查看全部问答>

m23调试时候出现问题

AT+CGDCONT=1,\"IP\",\"INTERNET\" OK AT%CGPCO=1,\"PAP,,\",1 OK AT$NOSLEEP=1 OK AT$DESTINFO=\"FTP.NTU.EDU.TW\",1,21,1 $DESTINFO: \"FTP.NTU.EDU.TW\", 1, 21 OK ATD*97# ERROR OK NO CARRIER ATD*97# ERROR OK NO CARRIER ...…

查看全部问答>

EVC中数据转换问题(TCHAR)

TCHAR *nTargetAddress m_SockAddrIn.sin_addr.S_un.S_addr=inet_addr(nTargetAddress); error C2664: \'inet_addr\' : cannot convert parameter 1 from \'unsigned short *\' to \'const char *\' 不知道这个怎么转?API里面是不是不能用CH ...…

查看全部问答>

spihelp

STM32的SPI做为从设备,SCK接2M时钟。STM32跑在32MHz上,现象:当用EXTI检测到一同步信号后,用SPI_I2S_SendData(新版的库)发送数据时看到MISO比EXTI有7--8us的延后。(EXTI中断服务程序中就一个函数SPI_I2S_SendData,EXTI设为上升沿触发)。 ...…

查看全部问答>

关于STM32的IO口输出问题

                                 在板子上的STM32烧毁一次之后(3.3v和地短接),重新换了一个新芯片之后,发现IO的低电平输出拉高到3V左右,可以保 ...…

查看全部问答>

TI的电源芯片LM2594

LM2594输入可高达60V,输出有3.3V,5V,12V等型号,电流可达500mA当输入电压越高时需要使用的二极管D1耐压就越大,此图为输入+24V,输出为5V,电流200mA左右,电感要用330uH,如果太小则输出电压不能保证,负载稍大则可能使输出电压被拉低,1N5819 ...…

查看全部问答>

初学FPGA (3):pin planner小常识(EEFPGA学习计划)

如图,在pin planner中,符号分为以下几类:   如图,在pin planner中,符号分为以下几类: 1. 圆形标记 表示普通用户IO引脚,可以由用户随意使用. 2. 三角标记 这类表示电源, 正三角表示VCC, 倒三角表示GND,  三角内部的O表示IO引脚 ...…

查看全部问答>

求9B96开发板光盘资料

因光盘不小心遗失,求9B96开发板光盘资料。邮箱wzpstudy@126.com 片子是C3的,例程最好为6288版本的。。。谢谢了 …

查看全部问答>