当前位置: 首页 > news >正文

《嵌入式硬件(十七):基于IMX6ULL的温度传感器LM75a操作》

一、LM75a

        三号引脚可以设置一个阈值,采集到的温度超过阈值时,会使电平进行翻转。也可以连接gpio,当温度到达阈值时,发出中断。

1.设备地址

2.寄存器

0x00是温度传感器的温度,只读

0x07是产品ID

读取俩个字节,0-6位需要去掉,读取的数乘0.5,为实际温度

3.时序

二、代码

        1.start.S

                加入cp11的(FPU,计算浮点数)使能代码(进入主函数之前调用)

_enable_fpu:// 1. 设置CPACR寄存器使能FPU访问mrc     p15, 0, r0, c1, c0, 2   // 读取CPACRorr     r0, r0, #(0xF << 20)    // 设置CP10和CP11为完全访问mcr     p15, 0, r0, c1, c0, 2   // 写回CPACR// 2. 使能FPUmov     r0, #0x40000000         // 设置FPEXC的EN位vmsr    fpexc, r0               // 写入FPEXC// 3. 配置FPSCRmov     r0, #0x00000000         // 清除所有标志位vmsr    fpscr, r0               // 写入FPSCRbx      lr                      // 返回

        2.i2c.c

                修改了寄存器地址,因为他不一定是一个字节

#include "i2c.h"
#include "fsl_iomuxc.h"
#include "delay.h"#define IEN         (7)
#define MSTA        (5)
#define MTX         (4)
#define TXAK        (3)
#define RSTA        (2)#define ICF         (7)
#define IBB         (5)
#define IAL         (4)
#define IIF         (1)void init_i2c1(void)
{IOMUXC_SetPinMux(IOMUXC_UART4_TX_DATA_I2C1_SCL, 1);IOMUXC_SetPinMux(IOMUXC_UART4_RX_DATA_I2C1_SDA, 1);IOMUXC_SetPinConfig(IOMUXC_UART4_TX_DATA_I2C1_SCL, 0xF0B0);IOMUXC_SetPinConfig(IOMUXC_UART4_RX_DATA_I2C1_SDA, 0xF0B0);  I2C1->I2CR &= ~(1 << 7);I2C1->IFDR = 0x15;I2C1->I2CR |= (1 << 7);    }void i2c_write(I2C_Type *base, unsigned char device_address, unsigned short reg_address, int reg_len, const unsigned char *data, int len)
{base->I2SR &= ~((1 << IAL) | (1 << IIF));while((base->I2SR & (1 << ICF)) == 0);base->I2CR |= (1 << MSTA) | (1 << MTX);base->I2CR &= ~(1 << TXAK);base->I2SR &= ~(1 << IIF);base->I2DR = device_address << 1;while((base->I2SR & (1 << IIF)) == 0);int i;  for(i = 0;i < reg_len;++i){base->I2SR &= ~(1 << IIF);base->I2DR = reg_address >> (reg_len - i - 1) * 8;while((base->I2SR & (1 << IIF)) == 0);          }while(len--){base->I2SR &= ~(1 << IIF);base->I2DR = *data++;while((base->I2SR & (1 << IIF)) == 0);         }base->I2CR &= ~(1 << MSTA);while((base->I2SR & (1 << IBB)) != 0){delayus(100);}
}void i2c_read(I2C_Type *base, unsigned char device_address, unsigned short reg_address, int reg_len, unsigned char *data, int len)
{base->I2SR &= ~((1 << IAL) | (1 << IIF));while((base->I2SR & (1 << ICF)) == 0);base->I2CR |= (1 << MSTA) | (1 << MTX);base->I2CR &= ~(1 << TXAK);base->I2SR &= ~(1 << IIF);base->I2DR = device_address << 1;while((base->I2SR & (1 << IIF)) == 0);int i;  //0x1234  reg_len = 2for(i = 0;i < reg_len;++i){base->I2SR &= ~(1 << IIF);base->I2DR = reg_address >> (reg_len - i - 1) * 8;while((base->I2SR & (1 << IIF)) == 0);          }base->I2CR |= (1 << RSTA);base->I2SR &= ~(1 << IIF);   base->I2DR = device_address << 1 | 1;while((base->I2SR & (1 << IIF)) == 0); base->I2CR &= ~(1 << MTX);base->I2SR &= ~(1 << IIF);  if(1 == len){base->I2CR |= (1 << TXAK);}*data = base->I2DR;while(len-- != 0){while((base->I2SR & (1 << IIF)) == 0);base->I2SR &= ~(1 << IIF);  if(len == 0)        {base->I2CR &= ~((1 << MSTA) | (1 << TXAK));while((base->I2SR & (1 << IBB)) != 0){delayus(100);}}else if(len == 1){base->I2CR |= (1 << TXAK);}*data++ = base->I2DR;}
}void xfer(I2C_Type *base, struct I2C_MSG *msg)
{if(msg->deiection == I2C_Write){i2c_write(base, msg->dev_address, msg->reg_address, msg->reg_len, msg->data, msg->len);}else{i2c_read(base, msg->dev_address, msg->reg_address, msg->reg_len, msg->data, msg->len);}
}

        3.i2c.h

#ifndef _I2C_H_
#define _I2C_H_#include "MCIMX6Y2.h"
extern void init_i2c1(void);
extern void i2c_write(I2C_Type *base, unsigned char device_address, unsigned short reg_address, int reg_len, const unsigned char *data, int len);
extern void i2c_read(I2C_Type *base, unsigned char device_address, unsigned short reg_address, int reg_len, unsigned char *data, int len);enum I2C_Driection
{I2C_Write = 0,I2C_Read = 1
};struct I2C_MSG
{unsigned char dev_address;unsigned short reg_address;int reg_len;unsigned char *data;int len;enum I2C_Driection deiection;
};extern void xfer(I2C_Type *base, struct I2C_MSG *msg);#endif

        4.lm75.c

#include "i2c.h"
#include "MCIMX6Y2.h"float lm75_get_temperature(void)
{unsigned char buffer[2] = {0};short s;struct I2C_MSG msg = {.deiection = I2C_Read,.dev_address = 0x48,.reg_address = 0,.reg_len = 1,.data = buffer,.len = 2};xfer(I2C1, &msg);// i2c_read(I2C1, 0x48, 0, 1,buffer, 2);s = buffer[0] << 8;s |= buffer[1];s >>= 7;return s * 0.5;
}

        5.lm75.h

#ifndef _LM75_H_
#define _LM75_H_extern float lm75_get_temperature(void);#endif

        6.main.c

#include "string.h"
#include "led.h"
#include "beep.h"
#include "MCIMX6Y2.h"
#include "key.h"
#include "interrupt.h"
#include "clock.h"
#include "epit.h"
#include "gpt.h"
#include "delay.h"
#include "uart.h"
#include "stdio.h"
#include "i2c.h"
#include "lm75.h"int main(void)
{init_clock();system_interrupt_init();init_led();init_beep();// init_key();
//    init_epit1();init_gpt1();init_uart1(); init_i2c1();while(1){delayms(500);float f;f = lm75_get_temperature();int k = f * 10;int n = k / 10;int m = k % 10;printf("%d.%d\n", n, m);}return 0;
}
http://www.dtcms.com/a/544671.html

相关文章:

  • 用 Go 手搓一个内网 DNS 服务器:从此告别 IP 地址,用域名畅游家庭网络!
  • Rust async/await 语法糖的展开原理:从表象到本质
  • Rust 零拷贝技术:从所有权到系统调用的性能优化之道
  • 浪潮服务器装linux系统步骤
  • 视频网站服务器带宽需要多少?视频网站服务器配置要求
  • 《嵌入式硬件(十八):基于IMX6ULL的ADC操作》
  • 注册网站发财的富豪北京公司如何做网站
  • 仓颉语言异常捕获机制深度解析
  • 基于SAP.NET Core Web APP(MVC)的医疗记录管理系统完整开发指南
  • 咖啡网站建设设计规划书wordpress修改首页网址导航
  • C#WPF UI路由事件:事件冒泡与隧道机制
  • 神经网络时序预测融合宏观变量的ETF动态止盈系统设计与实现
  • 分布式Session会话实现方案
  • Java创建【线程池】的方法
  • 相机直播,HDMI线怎么选择
  • 做外贸哪些国外网站可以推广上海中学地址
  • HFSS微带线仿真
  • 推荐常州微信网站建设网站友链怎么做
  • 多模态的大模型文本分类模型代码(二)——模型初步运行
  • 强化特权用户监控,守护Active Directory核心安全
  • Kafka Consumer 消费流程详解
  • 安全守护者:防爆外壳在气体传感器领域的关键应用
  • 【JavaEE初阶】网络经典面试题小小结
  • 以太网多参量传感器:构筑工业安全与环境稳定的“数据堡垒”
  • pinia-storeToRefs方法
  • 基于用户的协同过滤算法理解
  • jsp书城网站开发中国建设银行重庆网站首页
  • 郑州网站建设公司排名湖南省城乡住房建设厅网站
  • 蓝牙钥匙 第4次 蓝牙协议栈深度剖析:从物理层到应用层的完整架构解析
  • 口腔健康系统|口腔医疗|基于java和小程序的口腔健康系统小程序设计与实现(源码+数据库+文档)