STM32 IO 模拟IIC I2C

发布者:灵感狂舞最新更新时间:2019-04-02 来源: eefocus关键字:STM32  模拟IIC 手机看文章 扫描二维码
随时随地手机看文章


#define I2C_Speed        100000

#define I2C_EE             I2C1

 

 

 

#define uStatus0x80

#definedTime 5

 

 

#define I2C_EE_GPIO   GPIOB

#define I2C_EE_SCL         GPIO_Pin_5

#define I2C_EE_SDA         GPIO_Pin_4

#define I2C_EE_CLK         RCC_APB1Periph_I2C1

 

 

 

 

#define SCL_H         GPIOB->BSRR = GPIO_Pin_5

#define SCL_L         GPIOB->BRR  = GPIO_Pin_5

 

#define SDA_H         GPIOB->BSRR = GPIO_Pin_4

#define SDA_L         GPIOB->BRR  = GPIO_Pin_4

 

#define SCL_read      GPIOB->IDR  & GPIO_Pin_5

#define SDA_read      GPIOB->IDR  & GPIO_Pin_4

 

 

 

 

 

static unsigned int cntForInitial = 0;

static unsigned char fSigStatus = 0;

 

//static bool LedStatus = true;

 

void I2C_Init()

{

GPIO_InitTypeDef  GPIO_InitStructure;

 

    //* Configure I2C_EE pins: SCL and SDA

  GPIO_InitStructure.GPIO_Pin =  I2C_EE_SCL | I2C_EE_SDA;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;

  GPIO_Init(I2C_EE_GPIO, &GPIO_InitStructure);

}

 

 

static void i2c_start()

{

 SDA_H;

 SCL_H;

 DelayUs(dTime);

 SDA_L;

 DelayUs(dTime);

 SCL_L;

 DelayUs(dTime);

 

 //LedStatus = !LedStatus;

 //f_LCT1(LedStatus);

}

 

 

 

/*

******************************************************************

Fuction:

Stop i2c

******************************************************************

*/

static void i2c_stop()

{

    SDA_L;

 SCL_H;

 DelayUs(dTime);

 SDA_H;

 DelayUs(dTime);

 SCL_H;

 DelayUs(dTime);

}

 

/*

******************************************************************

Fuction:

i2c  Master wait for ack

Only ack

******************************************************************

*/

static unsigned char i2c_rd_ack()

{

    unsigned char flag = 0;

    SDA_H;

 SCL_H;

 DelayUs(dTime/2);

 flag = SDA_read;

 DelayUs(dTime/2);

 SCL_L;

 DelayUs(dTime/2);

 if(flag == 1)

 return 0;

 return 1;

}

 

/*

******************************************************************

Fuction:

i2c  Byte transmission

Only Send,no ack,no stop

******************************************************************

*/

static unsigned char i2c_sb(unsigned char Byte)

{

unsigned char cnt;

SCL_L;

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

{

 

  if(Byte&0x80)

   SDA_H;

   else

   SDA_L;

   DelayUs(dTime);

   SCL_H;

   DelayUs(dTime);

   SCL_L;

   Byte <<= 1;

   DelayUs(dTime);

}

 

return i2c_rd_ack();

 

}

 

 

 

 

/*

******************************************************************

Fuction:

i2c Byte receive

Return Byte

******************************************************************

*/

static unsigned char i2c_rb()

{

unsigned char cnt;

unsigned char Byte=0;

 

SDA_H;

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

      {

 

Byte <<= 1;

DelayUs(dTime);

SCL_H;

DelayUs(dTime);

if(SDA_read)

Byte |= 0x01;

SCL_L;

DelayUs(dTime);

      }

    return Byte;

}

 

 

 

/*

******************************************************************

Fuction:

i2c ACK  Master send

******************************************************************

*/

static void i2c_wr_ack(unsigned char ACK)

{

  if(ACK)

SDA_H;

else

SDA_L;

 SCL_H;

 DelayUs(dTime);

 SCL_L;

 DelayUs(dTime);

}

 

 

/*

******************************************************************

Fuction:

i2c Byte receive

Return Byte

******************************************************************

*/

uint8_t ReadReg(unsigned int addr)

{

    uint8_t temp;

 

i2c_start();

if(!i2c_sb(BRG_DEV_ADDR))

{

i2c_stop();

return 0;

}

 

if(!i2c_sb((uint8_t)(addr >> 8)))

{

i2c_stop();

return 0;

}

 

if(!i2c_sb((uint8_t)(addr & 0xFF)))

{

i2c_stop();

return 0;

}

 

i2c_start();

 

if(!i2c_sb(BRG_DEV_ADDR |0x01))

{

i2c_stop();

return 0;

}

temp = i2c_rb();

i2c_wr_ack(1);

i2c_stop();

return temp;

}

unsigned char WriteReg8(unsigned int addr,unsigned char wData)

{

i2c_start();

if(!i2c_sb(BRG_DEV_ADDR))

{

i2c_stop();

return 0;

}

 

if(!i2c_sb((unsigned char)(addr >> 8)))

{

i2c_stop();

return 0;

}

 

if(!i2c_sb((unsigned char)(addr & 0xFF)))

{

i2c_stop();

return 0;

}

 

if(!i2c_sb((unsigned char)(wData)))

{

i2c_stop();

return 0;

}

i2c_stop();

//DelayUs(1);

return 1;

}

 

unsigned char WriteReg16(unsigned int addr,unsigned char wData1,unsigned char wData2)

{

i2c_start();

if(!i2c_sb(BRG_DEV_ADDR))

{

i2c_stop();

return 0;

}

 

if(!i2c_sb((unsigned char)(addr >> 8)))

{

i2c_stop();

return 0;

}

 

if(!i2c_sb((unsigned char)(addr & 0xFF)))

{

i2c_stop();

return 0;

}

 

if(!i2c_sb((unsigned char)(wData2)))

{

i2c_stop();

return 0;

}

 

if(!i2c_sb((unsigned char)(wData1)))

{

i2c_stop();

return 0;

}

 

i2c_stop();

DelayUs(1);

return 1;

}

 

 

unsigned char WriteReg32(unsigned int addr,unsigned char wData1,unsigned char wData2,unsigned char wData3,unsigned char wData4)

{

i2c_start();

if(!i2c_sb(BRG_DEV_ADDR))

{

i2c_stop();

return 0;

}

 

if(!i2c_sb((unsigned char)(addr >> 8)))

{

i2c_stop();

return 0;

}

 

if(!i2c_sb((unsigned char)(addr & 0xFF)))

{

i2c_stop();

return 0;

}

 

if(!i2c_sb((unsigned char)(wData4)))

{

i2c_stop();

return 0;

}

 

if(!i2c_sb((unsigned char)(wData3)))

{

i2c_stop();

return 0;

}

 

if(!i2c_sb((unsigned char)(wData2)))

{

i2c_stop();

return 0;

}

 

if(!i2c_sb((unsigned char)(wData1)))

{

i2c_stop();

return 0;

}

 

i2c_stop();

DelayUs(1);

return 1;

}


关键字:STM32  模拟IIC 引用地址:STM32 IO 模拟IIC I2C

上一篇:STM32F030 I2C 从模式中断编程
下一篇:模拟串口UART的实现

推荐阅读最新更新时间:2024-03-16 16:26

基于STM32的远程温控系统设计
温度控制是工业控制的主要对象之一,常用的温控数学模型是一阶惯性加上纯滞后环节,但其随着加热对象和环境条件的不同,会存在着较大的差异。因为温控对象这种较为普遍的含有纯滞后环节的特点,容易引起系统超调和持续的振荡,温度控制对象的参数会发生幅度较大的变化。因此无法采用传统的控制方法(如常规的PID控制)对温度进行有效的控制,而智能控制不需要对象的精确数学模型就可以对系统实施控制 。温度控制多采用由单片机系统来实现温度控制,其缺点是远程控制系统复杂,可靠性差,特别是当控制点较多、距离较远时,采取总线方式的通讯出错概率较高,影响到温度的控制精度 。   目前,多家厂商(如日本导电、岛通)均推出精度可达0.1级的基于PID算法的智能型温控仪
[工业控制]
基于<font color='red'>STM32</font>的远程温控系统设计
STM32学习笔记——TFT2.4彩屏显示字符和汉字
利用彩屏显示汉字、字符和字符串,需要先完成彩屏的驱动程序,然后在驱动程序的基础上再编写应用程序。 彩屏的驱动程序如果写好的话,就可以一直使用了,精力主要集中在应用程序的编写就可以了,但是移植的话,要移植驱动程序。其实移植也只是改变那些很底层的靠近处理器的那部分代码。 代码如下,注释比较详细,看懂了基本就可以了。 驱动程序的头文件LCD_driver.h如下: #define uchar unsigned char #define uint unsigned int #define Bus_16 //16位数据模式,如果使用8位模式,请注释此语句,如果使用16位模式,请打开此句
[单片机]
STM32 USB断开连接代码停止运行
这段时间做USB固件升级,使用ST官方固件,最开始按照ST的做法通过检测按键进入DFU模式。后来由于别人觉得这种方式做不好,要改成检测USB的而不是检测按键的。但是当我改好了测试的时候却发现当我把USB初始化之后断开了USB连接程序停止了运行,接上USB程序才会继续跑。连使用Jlink调试都没用了。然而根据打印调试,USB接上的时候MCU并没有复位,硬件出错其实也不太像,总之觉得一切很诡异。至少在当时我根本就没办法解释我所观察到的这个现象。百度也没有结果,大多数情况下百度其实很废但是没办法。 想了很久我觉得是不是MCU休眠去了?带着这样的猜测到初始化过程中去找相关初始化,因为在我印象当中,睡眠模式也是需要初始化寄
[单片机]
STM32硬件复位时间
两个参数,,1低电平时间 2低电平压值 1.stm32复位时间 ------ 低电平时间:1.5 至 4.5 ms 2.压值
[单片机]
<font color='red'>STM32</font>硬件复位时间
一文详解STM32的时钟系统
STM32的时钟树 时钟信号推动单片机内各个部分执行相应的指令,时钟就像人的心跳一样。 STM32本身十分复杂,外设非常多,任何外设都需要时钟才能启动,但并不是所有的外设都需要系统时钟那么高的频率,如果都用高速时钟势必造成浪费。同一个电路,时钟越快功耗越大、抗电磁干扰能力越弱。复杂的MCU采用多时钟源的方法来解决这些问题。如下图,是STM32的时钟系统框图。 如上图左边的部分,看到STM32有4个独立时钟源,HSI、HSE、LSI、LSE。 HSI是高速内部时钟,RC振荡器,频率为8MHz,精度不高。 HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。 LSI是低速内部时钟,RC
[单片机]
一文详解<font color='red'>STM32</font>的时钟系统
STM32串口使用心得(一)——DMA+空闲中断接收
一,因何用之? 之前曾经写过一篇《关于CubeMX的串口全双工接收发送锁死的问题》的文章,讨论了STM32的串口在全双工模式下会出现锁死问题的现象。当时的解决办法是在串口接收中断中加入解锁机制,貌似临时解决了这个问题。但这几天程序不知道怎么回事,又开始频繁地出现死机现象,而且仿真的时候会进入HardFault()。 二,缘何致之? 最让人头疼的问题就是大部分时间里没有问题。 死机的现象总是在意想不到的情形下发生,可能刚下载完程序就出现了;或者正常跑了好几天才出现。所以,为了寻找死机的原因,采取了以下两种方式: 1,缩短任务执行的延时,加重MCU负担。此举可使死机的概率大幅提高。(仔细想来,之前貌似解决问题的时候
[单片机]
STM32 TIM1的PWM没有输出
设置了TIM1的CHN1及CHN4输出PWM,代码如下,但是仿真的波形不对,上设备也不正确: RCC- APB2ENR|=1 11; //TIM1时钟使能 RCC- APB2ENR|=1 2; //使能PORTA时钟 GPIOA- CRH&=0XFFFFFFF0;//PA8输出 GPIOA- CRH|=0X0000000B;//通用推挽输出 GPIOA- ODR|=1 8;//PA8上拉 GPIOA- CRH&=0XFFFF0FFF;//PA11输出 GPIOA- CRH|=0X0000B000;//通用推挽输出 GPIOA- ODR|=1 11;//PA11上拉
[单片机]
STM32的基本系统是怎样的?
电源 无论是否使用模拟部分和AD部分,MCU外围出去VCC和GND,VDDA、VSSA、Vref(如果封装有该引脚)都必需要连接,不可悬空 对于每组对应的VDD和GND都应至少放置一个104的陶瓷电容用于滤波,并接该电容应放置尽量靠近MCU 用万用表测试供电电压是否正确,调试时最好用数字电源供电,以便过压或过流烧坏板子,电压最好一步一步从进线端测试到芯片供电端 复位、启动选择 Boot引脚与JTAG无关。其仅是用于MCU启动后,判断执行代码的起始地址 在电路设计上可能Boot引脚不会使用,但要求一定要外部连接电阻到地或电源,切不可悬空;STM32三种启动模式对应的存储介质均是芯片内置的,它们是: 用户闪存 = 芯片内置的Fla
[单片机]
<font color='red'>STM32</font>的基本系统是怎样的?
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved