IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32L051测试 (三、I2C协议设备的添加测试) -> 正文阅读

[嵌入式]STM32L051测试 (三、I2C协议设备的添加测试)

前面两篇文章,把L051基本功能都测试过了,确实感觉到ST的CubeMX工具真是好用,对应换芯片的应用来说,着实方便,底层库封装好,上层应用程序基本都一样~~
今天我们就来吧I2C设备添加一下,今天正好借这个机会,把I2C的代码优化一下。
1、CubeMX IO口的设置
模拟I2C的IO口都设置为开漏输出,因为电路图上有外部上拉。
初始化的时候,2个SDA和SCL都得拉高。所以设置如下:
在这里插入图片描述

2、做一个us延时函数
在HAL库中,只有ms的延时函数HAL_Delay,没有us的延时函数,今天用了网上一个延时函数,发现有问题,搞得整个时钟出了问题,郁闷,折腾了一下午。
时间浪费了,通讯模块那边因为这个时钟设置也出了点问题,一直返回复位信息,用了怎么多年的芯片还第一次遇到,Enocean 的TCM310模块,主要这个技术支持也不太好找。
= =!
还是快速找一个us函数,不是那么精确也可以,直接用空语句测试,后面已经经过测试,下面这个函数做的us延时可以正常移植以前的I2C程序。

/* USER CODE BEGIN 4 */
void delay_us(uint32_t Delay)
{
  uint32_t cnt = Delay * 8;  
  uint32_t i = 0;
  for(i = 0; i < cnt; i++)__NOP();
}
/* USER CODE END 4 */

3、移植I2C代码
3.1 SHT21温湿度传感器
代码移植没什么问题,
i2c.c:

#include "i2c.h"

// ------------------------------------------------------------------
void i2c_init(void)  {
  
// the SDA and SCL pins are defined as input with pull up enabled
  // pins are initialized as inputs, ext. pull => SDA and SCL = high

}
// ------------------------------------------------------------------
// send start sequence (S)

void i2c_start(void)  {                                    
  	sda_high(); 
		delay_us(10);
  	scl_high();		
		delay_us(10);
  	sda_low();	
		delay_us(10);
	scl_low();                                                   
		delay_us(10);
}
// ------------------------------------------------------------------
// send stop sequence (P)
void i2c_stop(void)  {                             
  	sda_low();                                                                          
		delay_us(10);
  	scl_low();                                       
		delay_us(10);                                 
  	scl_high();                                         
		delay_us(10);                                       
  	sda_high();
		delay_us(10);
}
// ------------------------------------------------------------------
// returns the ACK or NACK
uint8 i2c_write(uint8 u8Data) 
{
	uint8 u8Bit;
	uint8 u8AckBit;
	// write 8 data bits
	u8Bit = 0x80;  //msb first  
	while(u8Bit) {
		if(u8Data&u8Bit) { 
			sda_high();
			delay_us(20);
		} 
		//& compare every bit
		else{ 
			sda_low();
			delay_us(20);
		}			
		scl_high();
		delay_us(30);
		u8Bit >>= 1; 
		//next bit
		scl_low();
		delay_us(30);
	}
	// read acknowledge (9th bit) 
	sda_high();                                               
	delay_us(10);		
	scl_high();
	delay_us(10);
	u8AckBit= sda_read();	//#define sda_read()  (sda_port & sda_pin)? 1 :0  ack on bus is low -> u8AckBit = 1   sda_port gpio0   sda_pin SCSEDIO0
	delay_us(10);
    scl_low();                                              
	delay_us(10);
    return u8AckBit;
}
// ------------------------------------------------------------------
// pass the ack/nack 
// returns the read data 
uint8 i2c_read(uint8 u8Ack)  
{
	uint8 u8Bit;
	uint8 u8Data;
	u8Bit = 0x80;       // msb first
	u8Data = 0;
	while(u8Bit){
		scl_high();
		
		delay_us(20);
	
		u8Bit >>= 1;    //next bit
		u8Data <<= 1;
	
		u8Data |= sda_read();         //(sda_port & sda_pin)? 1 :0      sda_port gpio0   sda_pin SCSEDIO0
		delay_us(20);
	
		scl_low();
		delay_us(50);
    }
	// 9th bit acknowledge
	if(u8Ack==I2C_ACK) {
		sda_low();
		delay_us(20);
	}     
	//I2C_ACK=0
	else {
		sda_high();
		delay_us(20);
	}
  	scl_high();
	delay_us(20);
	scl_low();
	delay_us(20);
	sda_high();
	delay_us(20);									
    return u8Data;
}

i2c.h:

#ifndef _I2C_H_INCLUDED
#define _I2C_H_INCLUDED

#include "main.h"
#include "Datadef.h"
        
// #define I2C_CLK_HIGH()  HAL_GPIO_WritePin(sht_scl_GPIO_Port,sht_scl_Pin,GPIO_PIN_SET);
// #define I2C_CLK_LOW()  	HAL_GPIO_WritePin(sht_scl_GPIO_Port,sht_scl_Pin,GPIO_PIN_RESET);

// #define I2C_DATA_HIGH()   HAL_GPIO_WritePin(sht_sda_GPIO_Port,sht_sda_Pin,GPIO_PIN_SET); 
// #define I2C_DATA_LOW()    HAL_GPIO_WritePin(sht_sda_GPIO_Port,sht_sda_Pin,GPIO_PIN_RESET);  
// #define I2C_DATA_STATE()  (HAL_GPIO_ReadPin(sht_sda_GPIO_Port,sht_sda_Pin) == GPIO_PIN_SET); 

// #define sda_high()  I2C_DATA_HIGH()     // set signals to HIGH first before selecting IN -> slew rates
// #define sda_low()   I2C_DATA_LOW() 
// #define sda_read()  I2C_DATA_STATE()    //ack on bus is low -> u8AckBit = 1

// #define scl_high()  I2C_CLK_HIGH()     // set signals to HIGH first before selecting IN -> slew rates
// #define scl_low()   I2C_CLK_LOW() 

#define sda_high()  HAL_GPIO_WritePin(sht_sda_GPIO_Port,sht_sda_Pin,GPIO_PIN_SET); 
#define sda_low()   HAL_GPIO_WritePin(sht_sda_GPIO_Port,sht_sda_Pin,GPIO_PIN_RESET);
#define sda_read()  (HAL_GPIO_ReadPin(sht_sda_GPIO_Port,sht_sda_Pin) == GPIO_PIN_SET);

#define scl_high()  HAL_GPIO_WritePin(sht_scl_GPIO_Port,sht_scl_Pin,GPIO_PIN_SET);
#define scl_low()   HAL_GPIO_WritePin(sht_scl_GPIO_Port,sht_scl_Pin,GPIO_PIN_RESET);
                         
                         
// ------------------------
#define DONOTHING()          {;}

// ------------------------
// command's
#define I2C_WRITE             0 
#define I2C_READ              1
#define I2C_ACK               0
#define I2C_NACK              1

void i2c_init(void);
void i2c_start(void);
void i2c_stop(void);
uint8 i2c_write(uint8 u8Data);
uint8 i2c_read(uint8 u8Ack);

#endif

SHT21部分的驱动就不用怎么修改了,基本上直接拿过来,把ms延时函数替换一下,就直接用,这里就不贴出来

测试结果:
在这里插入图片描述
板载的HTU21D,实际测试下来,一直会比空气问题高一点,这个问题,我倒是有点头疼,虽然做过分割,不铺铜等一些处理,还是不尽如人意。

3.1 欧姆龙远距离红外测温D6T系列
其实有了上面的成功案例,这个也不是什么问题,还是老样子,定义好IO口,写好驱动逻辑,主要是因为板子上接口还没焊接,明天再试试,再接着补充一下。

完成了这几个工作,下面一篇文章应该会学习L051 的 flash读写操作,因为项目中总得有一些设置需要掉线不丢失的,以前F103都是直接保存在内部flash中,L051的flash读写操作是怎么实现的,明天我们拭目以待!

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-07-16 11:27:52  更:2021-07-16 11:29:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/28 14:10:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码