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 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/2019/ic-news040243684.html

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

推荐阅读

STM32 SPI硬件模式
反复试验,发现SPI_NSS引脚的自动硬件控制与想象的不同,无论是否外加上拉,只要一使能SPI,SPI_Cmd(SPI1, ENABLE); SPI_NSS引脚就一直处于低电平,直到SPI_Cmd(SPI1, DISABLE);这个需要用程序来控制。  而用过其他芯片则是发送完成自动会拉高,这点是要注意的我说的就是做主机的时候SPI_SSOutputCmd(SPIx,ENABLE) 在soft模式时这句话有必要吗?我的理解是当hard模式,需要multimaster的时候,才应该要开启这个output功能,这点从我的截图上可以看出。我觉得,这里只要把SPI_InitStructure
发表于 2022-02-21
<font color='red'>STM32</font> SPI硬件模式
STM32 timer input filter
STM32的定时器输入通道都有一个滤波单元,分别位于每个输入通路上(下图中的黄色框)和外部触发输入通路上(下图中的兰色框),它们的作用是滤除输入信号上的高频干扰。具体操作原理如下:在TIMx_CR1中的CKD[1:0]可以由用户设置对输入信号的采样频率基准,有三种选择:1)采样频率基准fDTS=定时器输入频率fCK_INT2)采样频率基准fDTS=定时器输入频率fCK_INT/23)采样频率基准fDTS=定时器输入频率fCK_INT/4然后使用上述频率作为基准对输入信号进行采样,当连续采样到N次个有效电平时,认为一次有效的输入电平。实际的采样频率和采样次数可以由用户程序根据需要选择;外部触发输入通道的滤波参数在从模式控制寄存器(TI
发表于 2022-02-21
<font color='red'>STM32</font> timer input filter
关于STM32影子寄存器和预装载寄存器和TIM_ARRPreloadConfig
本文的说明依据STM32参考手册(RM0008)第10版:英文:http://www.st.com/stonline/products/literature/rm/13902.pdf中译文:http://www.stmicroelectronics.com.cn/stonline/mcu/images/STM32_RM_CH_V10_1.pdf在STM32参考手册的第13、14章中,都有一张定时器的框图,下面是第14章中定时器框图的局部,图中黄色框所示的是auto-reload register,在下面的第14.3.2节"Counter Modes"就解释了auto-reload register的用法。在图中可
发表于 2022-02-21
关于<font color='red'>STM32</font>影子寄存器和预装载寄存器和TIM_ARRPreloadConfig
stm32 Fdts
发表于 2022-02-21
<font color='red'>stm32</font> Fdts
STM32定时器输出比较模式
OCx与OCxREF和CCxP之间的关系初学STM32,我这个地方卡了很久,现在终于有些明白了,现在把我的理解写下与大家共享,如果有不对的地方,还请指出。-----------------------------------------------------------------------------------------------------------------------TIM_OCMode选择定时器模式。该参数取值见下表:TIM_OCInitStructure.TIM_Pulse = CCR1_Val; //设置跳变值,当计数器计数到这个值时,电平发生跳变TIM_OC2PreloadConfig(TIM3, TI
发表于 2022-02-18
<font color='red'>STM32</font>定时器输出比较模式
stm32库函数学习篇
两天学习了一下stm32通用定时器的输入捕获功能。在网上看到很多网友说触发中断程序进不了,于是自己也测试了个小程序,还好能够进入中断。呵呵~ 实现功能:PA8随意延时驱动led灯闪烁,并且将PA8用杜邦线连接到PA7口,PA7是通用定时器TIM3的2通道,在TIM3_CH2触发中断程序中取反连接到PD2口的led灯,指示中断程序运行,并且每次进入中断后改变触发捕获的极性。实现两个led灯会交替闪烁。 先有必要了解stm32定时器的输入触发模块,如下图:需要注意的是,一眼望去一个定时器似乎有8个通道,左边四个,右边四个,但其实左边和右边是共用相同的IO引脚,所以名称标注是一模一样。也就是说,每个通用定时器都只有四个
发表于 2022-02-18
<font color='red'>stm32</font>库函数学习篇
小广播
设计资源 培训 开发板 精华推荐

何立民专栏 单片机及嵌入式宝典

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

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