STM32配置IIC接口通信方式参考源码

发布者:翠绿山水最新更新时间:2024-10-09 来源: cnblogs关键字:STM32  通信方式 手机看文章 扫描二维码
随时随地手机看文章

最近在读取SHT3x系列sensor的温度和湿度,用到的是IIC接口。

顺便写了一下STM32的IIC接口。


这次配置的是STM32内部的IIC接口。


注意:读的时候,怎么发送Ack, 和 NAck信号,参考stm的设计文档。


#include 'Dev_SHT3X.h'

#include 'globalDef.h'

#include



#define I2C1_OWN_ADDRESS7 0x0A

#define I2C_Speed         40000

#define SHT3X_ADDRESS     0x44


/* read out command */

#define CMD_READH_SHX     0x2c

#define CMD_READL_SHX     0x06


/**

* SHX device: IIC1

* PB6 - SCL

* PB7 - SDA

*/

static void IIC_gpioConfig(void)

{

    GPIO_InitTypeDef GPIO_InitStructure;


    /* 使能与 I2C1 有关的时钟 */

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);


    /* PB6-I2C1_SCL、PB7-I2C1_SDA*/

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;     // 开漏输出

    GPIO_Init(GPIOB, &GPIO_InitStructure);        

}


static void IIC_modeConfig(void)

{

    I2C_InitTypeDef I2C_InitStructure;


    I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; /* I2C 配置 */

    I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; /* 高电平数据稳定,低电平数据变化 SCL 时钟线的占空比 */

    I2C_InitStructure.I2C_OwnAddress1 = I2C1_OWN_ADDRESS7; /* setting master address. */

    I2C_InitStructure.I2C_Ack = I2C_Ack_Enable ; /* enable ack */

    I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; /* 7-bit addressing mode */

    I2C_InitStructure.I2C_ClockSpeed = I2C_Speed; /* communication speed <= 400k */


    I2C_Init(I2C1, &I2C_InitStructure);

    I2C_Cmd(I2C1, ENABLE);    

}



void SHT3X_InitDevice(void)

{

    IIC_gpioConfig();    

    IIC_modeConfig();

}



void sht3x_readTempHumi(uint8_t* pBuffer, uint8_t NumByteToRead)

{

    while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)); /* detect IIC busy */


    I2C_GenerateSTART(I2C1, ENABLE); /* Send START condition */


    /* Test on EV5 and clear it */

    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));


    /* Send slave device address for write */

    I2C_Send7bitAddress(I2C1, (SHT3X_ADDRESS << 1), I2C_Direction_Transmitter);


    /* Test on EV6 and clear it */

    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));


    /* Clear EV6 by setting again the PE bit */

    I2C_Cmd(I2C1, ENABLE);


    /* Send the device address to write to */

    I2C_SendData(I2C1, CMD_READH_SHX);


    /* Test on EV8 and clear it */

    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));


    /* Send the device address to write to */

    I2C_SendData(I2C1, CMD_READL_SHX);


    /* Test on EV8 and clear it */

    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));


//------------------------------------------------


    /* Send STRAT condition a second time */

    I2C_GenerateSTART(I2C1, ENABLE);


    /* Test on EV5 and clear it */

    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));


    /* Send shx address for read */

    I2C_Send7bitAddress(I2C1, ((SHT3X_ADDRESS << 1) | 0x01), I2C_Direction_Receiver);


    /* Test on EV6 and clear it */

    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));


    /* While there is data to be read */

    while(NumByteToRead)

    {

        if(NumByteToRead == 1)

        {

            /* Disable Acknowledgement */

            I2C_AcknowledgeConfig(I2C1, DISABLE);


            /* Send STOP Condition */

            I2C_GenerateSTOP(I2C1, ENABLE);

        }


        /* Test on EV7 and clear it */

        if(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED))

        {

            /* Read a byte from the EEPROM */

            *pBuffer = I2C_ReceiveData(I2C1);


            /* Point to the next location where the byte read will be saved */

            pBuffer++;


            /* Decrement the read bytes counter */

            NumByteToRead--;

        }

    }


    /* Enable Acknowledgement to be ready for another reception */

    I2C_AcknowledgeConfig(I2C1, ENABLE);

}




//-----------------------------------------------------------------------------

static float SHT3X_CalcTemperature(uint16_t rawValue)

{

    // calculate temperature [°C]

    // T = -45 + 175 * rawValue / (2^16-1)

    return 175.0f * (float)rawValue / 65535.0f - 45.0f;

}


//-----------------------------------------------------------------------------

static float SHT3X_CalcHumidity(uint16_t rawValue)

{

    // calculate relative humidity [%RH]

    // RH = rawValue / (2^16-1) * 100

    return 100.0f * (float)rawValue / 65535.0f;

}


void sht3x_testTask(void)

{

    uint8_t recBuffer[6];

    uint16_t rawdata;

    float fTemp, fHumi;


    sht3x_readTempHumi(&recBuffer[0], 6);

    rawdata = recBuffer[0];

    rawdata = (rawdata << 8) + recBuffer[1];

    fTemp = SHT3X_CalcTemperature(rawdata);


    rawdata = recBuffer[3];

    rawdata = (rawdata << 8) + recBuffer[4];

    fHumi = SHT3X_CalcHumidity(rawdata);


    enterCriticalSection();

    printf('T: %0.2f, H: %0.1frn', fTemp, fHumi);

    exitCriticalSection();

}


#ifndef _DEV_SHT3X_H

#define _DEV_SHT3X_H


#include 'bsp_iic.h'

#include 'bsp_SysConfig.h'




extern void SHT3X_InitDevice(void);

extern void sht3x_testTask(void);



#endif /* _DEV_SHT3X_H */


关键字:STM32  通信方式 引用地址:STM32配置IIC接口通信方式参考源码

上一篇:Stm32使用Usart代码例子(轮询、中断、DMA)
下一篇:stm32中将结构体数据写到内部Flash时遇到的问题

推荐阅读最新更新时间:2024-11-12 13:11

STM32之FSMC的液晶使用
经过这两天的学习液晶,对STM32的FSMC有了初步的了解。虽然遇到了一些问题,但经过不懈的努力,都一一的解决了,接下来我就使用FSMC可能遇到的问题进行说明。希望能对大家的学习有所帮助。 一、端口配置 1、 由于FSMC写NOR时序与8080接口的时序十分相识,因此我们采用模拟8080时序, 2、 STM32的引脚图如图所示。 3、根据上图我们可以得出,FSMC的数据端口D 如下 4、我们使用的是 FSMC 的信号线 NE1 作为控制 8080 的 CSX 片选信号,所以我们把本成配置为 FSMC_Bank1_NORSRAM1 (NE1 片选BANK1)。由上图得FSMC-NE1 ==PD7
[单片机]
STM32 无法通过 %f 打印浮点数
一、问题 使用 IAR 开发 STM32,发现无法通过 printf 重定向到串口打印出浮点数。代码如下: 输出结果如下: 可见,浮点数部分无法正常显示。 二、解决方法 这是由于 IAR 默认选择的 printf 库不支持浮点数的的输出。可在设置选项中修改。如下:默认使用 small,改为 auto 即可。 三、备注 在不修改设置的情况下,尝试过如下两种代码解决。一种是通过 sprintf 将浮点数转换成字符串输出,另一种是分解整数和小数部分,分别输出。第一种方法也是不可行的,只有分解可以。 代码如下: /* * cyang 2018/2/27 * mcu printf float value */ #in
[单片机]
stm32检测按键单击,双击,长按
硬件连接: 按键上拉 外设配置: 外部配置为下降沿中断,定时器中断时间为5ms。定时器中断抢占优先级必须高于外部中断 检测方法: 定义一个时间,在该时间段里检测到一个下降沿,认为是单击;低电平持续时间超过该时间,认为是长按;检测到两个下降沿认为是双击。 代码 #define KEY_PRESS_TIME 800 //检测时间段 uint16_t key_time_cnt = KEY_PRESS_TIME + 5; bool key_pressed = false; //单击标志 bool key_long_pressed = true; //长按标志 void
[单片机]
STM32定时器(三)输入捕获
一、STM32定时器捕获功能 STM32的定时器是支持信号输入捕获的,何为输入捕获?主要做什么应用? 输入捕获:通过检测TIMx_CHx上的边沿信号,在边沿信号发生跳变的时候,将当前的定时器的值(TIMx_CNT)存放到对应的捕获比较寄存器里面,完成一次捕获。输入捕获主要应用于测量信号的脉宽或频率。 下图是定时器原理图的输入捕获框图部分 第一部分是设置滤波器,用来对信号进行滤波,信号从TI1输入,通过滤波器,输出TIF信号,正常情况下信号没有抖动,TI1F信号等于TI1的输入信号。 ICF 用来设置输入采样频率的数字滤波器的长度,如ICF=0011,会在捕获上升沿时,以fCK_INT的频率连续采样八次通道1的信号电平,若都
[单片机]
<font color='red'>STM32</font>定时器(三)输入捕获
STM32学习记录12 中断向量表
从stm32f10x.s可以看到,已经定义好了一大堆的中断响应函数,这就是中断向量表,标号__Vectors,表示中断向量表入口地址,例如: AREA RESET, DATA, READONLY ; 定义只读数据段,实际上是在CODE区(假设STM32从FLASH启动,则此中断向量表起始地址即为0x8000000) EXPORT __Vectors IMPORT OS_CPU_SysTickHandler IMPORT OS_CPU_PendSVHandler __Vectors DCD __initial_sp ; Top of Stack DCD Reset_
[单片机]
<font color='red'>STM32</font>学习记录12 中断向量表
stm32+fpga架构的运动控制器
因为fpga的高速、高同步、纯硬件的特点,可以很好的实现多轴的同步和单轴任意频率脉冲的生成,远远比stm32自带的定时器好用。结合f407的高性能,高可靠,方便的开发环境,可以组合在一起做成类似dsp+fpga的运动卡,但是价格低廉,用户入门容易。 Stm32采用stm32f407,不扩展内存sram,外部fpga采用ep4ce6,引脚采用多的那种(黑金的那种),板子上使用rtc电池,用来保持断电保护的sram内容。 stm32板子支持以太网,mac使用f407自带的mac器件。 支持usb,232c,485,can通讯。 usb用来实现和pc机的连接,232c和485则可以使用modbus-rtu协议,以太网则实现eco
[单片机]
STM32如何配置使用SPI通信
简介:SPI是一种高速的,全双工,同步的通信总线,原理和使用简单,占用引脚资源少,是一种常用的通信方式。 STM32通常有2~3个SPI接口 根据STM32手册的使用方法: 1. Enable peripheral clock 2. Enable SCK, MOSI, MISO and NSS GPIO clocks 3. Peripherals alternate function:  Connect the pin to the desired peripherals' Alternate Function (AF)  Call GPIO_Init() function. 4. P
[单片机]
ST STM32Cube™工具将支持STM32 F2
中国,2014年4月14日 ——意法半导体发布新款STM32Cube™开发平台中间件,让开发人员可以在该开发平台上开发STM32 F2 120MHz ARM® Cortex®-M3微控制器应用。STM32Cube目前可支持STM32 F2和F4系列产品,预计今年还将推出新的版本,将支持范围扩大到STM32全系列产品。 新的中间件与STM32Cube平台的通用低层驱动程序和硬件抽象层(HAL,硬體抽象層(HAL,Hardware Abstraction Layer)配合使用,提供一套可直接使用的自动升级的软件组件库,以简化应用开发任务,解决版本问题和依赖性问题。硬件抽象层HAL可简化代码移植过程,协助设计人员为每个应
[单片机]
ST STM32Cube™工具将支持<font color='red'>STM32</font> F2
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved