crystal008 2015-3-27 13:49

LMP91000是一个可编程的模拟前端,用于微功率电化学传感器。该芯片很早就开始研究,中间由于其他事情耽搁,最近又拾起来啦,所以做的比较久远;不过还好最终还是完成啦。值得注意的是,该芯片的浓度数据不是通过IIC读取的,而是通过ADC口读取到的,和传感器数据采集有些类似;IIC只是用来设置LMP91000芯片中寄存器的数值。以下是LMP91000芯片的驱动代码。 1. LMPIIC.H #ifndef __LMPIIC_H #define __LMPIIC_H #include #include "stm32f10x_i2c.h" #include "delay.h" #include "public.h" /***************************************IO方向设置**********************************************/ #define LMP_SDA_IN(){GPIOB-CRH=0XFFFF0FFF;GPIOB-CRH|=812;} #define LMP_SDA_OUT() {GPIOB-CRH=0XFFFF0FFF;GPIOB-CRH|=212;} //1 - 10MHZ2 - 2MHZ3- 50MHZ /***************************************IO操作函数**********************************************/ #define LMP_IIC_REF_EN PBout(13) //REF_EN #define LMP_IIC_MENB PAout(12) //MENB #define LMP_IIC_SCL PBout(10) //SCL #define LMP_IIC_SDA PBout(11) //SDA #define LMP_READ_SDA PBin(11) //输入SDA #define LMP_WRITE_ADDE 0x90 //LMP地址+写操作 #define LMP_READ_ADDE 0x91 //LMP地址+读操作 #define LMP_REG1_ADDE 0x00 //LMP寄存器1地址0x00 #define LMP_REG2_ADDE 0x01 //LMP寄存器2地址0x01 #define LMP_REG3_ADDE 0x10 //LMP寄存器3地址0x10 #define LMP_REG4_ADDE 0x11 //LMP寄存器4地址0x11 #define LMP_REG5_ADDE 0x12 //LMP寄存器5地址0x12 #define LMP_REG2_UNLOCK 0x00 //LMP寄存器2中的数据0x00 #define LMP_REG2_LOCK 0x01 //LMP寄存器2中的数据0x01 #define LMP_REG3_DATA 0x0F //LMP寄存器3中的数据0x0E #define LMP_REG4_DATA 0xB0 //LMP寄存器4中的数据0xB0 #define LMP_REG5_DATA 0x07 //LMP寄存器5中的数据0x07/03 /*************************************IIC所有操作函数*******************************************/ void LMP_IIC_Init_Func(void); //初始化IIC的IO口 void LMP_IIC_Start(void); //发送IIC开始信号 void LMP_IIC_Stop(void); //发送IIC停止信号 u8 LMP_IIC_Wait_Ack(void); //IIC等待ACK信号 void LMP_IIC_Ack(void); //IIC发送ACK信号 void LMP_IIC_NAck(void); //IIC不发送ACK信号 void LMP_IIC_Send_Byte(u8 txd); //IIC发送一个字节 u8 LMP_IIC_Read_Byte(u8 ack); //IIC读取一个字节 void LMP_Init_Func(void); //ADS初始化函数 u16LMP_Read_Func(void); //ADS读取函数 #endif 2. LMPIIC.C /************************************************************************************************ ** 函数名称:LMP_IIC_Init_Func ** 输入参数:无 ** 输出参数:无 ** 功能描述:初始化IIC的IO口以及调用ADS初始化函数 ************************************************************************************************/ void LMP_IIC_Init_Func(void) { GPIO_InitTypeDef GPIO_InitStructure; //PB10--SCLPB11--SDAPB13--REF_EN(LMP91000使用外部供电,供电使能位;也可选择使用内部供电) GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOB, GPIO_InitStructure); //PA12--MENB GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOA, GPIO_InitStructure); //PB1--LMP91000数据采集 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚 GPIO_Init(GPIOB, GPIO_InitStructure); LMP_IIC_REF_EN = 1; LMP_IIC_SCL=1; LMP_IIC_SDA=1; LMP_Init_Func(); } /************************************************************************************************ ** 函数名称:LMP_IIC_MENB ** 输入参数:无 ** 输出参数:无 ** 功能描述:产生IIC起始信号 ************************************************************************************************/ void LMP_IIC_Start(void) { LMP_IIC_MENB = 0;//MEBN拉低 delay_us(4); LMP_SDA_OUT(); //sda线输出 LMP_IIC_SDA=1; LMP_IIC_SCL=1; delay_us(4); LMP_IIC_SDA=0; //START:when CLK is high,DATA change form high to low delay_us(4); LMP_IIC_SCL=0; //钳住I2C总线,准备发送或接收数据 } /************************************************************************************************ ** 函数名称:LMP_IIC_Stop ** 输入参数:无 ** 输出参数:无 ** 功能描述:产生IIC停止信号 ************************************************************************************************/ void LMP_IIC_Stop(void) { LMP_SDA_OUT(); //sda线输出 LMP_IIC_SCL=0; delay_us(4); LMP_IIC_SDA=0; //STOP:when CLK is high DATA change form low to high delay_us(4); LMP_IIC_SCL=1; delay_us(4); LMP_IIC_SDA=1; //发送I2C总线结束信号 delay_us(4); LMP_IIC_MENB = 1;//MEBN拉高 } /************************************************************************************************ ** 函数名称:LMP_IIC_Wait_Ack ** 输入参数:无 ** 输出参数:返回值 1,接收应答失败 ** 0,接收应答成功 ** 功能描述:等待应答信号到来 ************************************************************************************************/ u8 LMP_IIC_Wait_Ack(void) { u8 ucErrTime=0; LMP_SDA_IN(); //SDA设置为输入 LMP_IIC_SDA=1; delay_us(1); LMP_IIC_SCL=1; delay_us(1); while(LMP_READ_SDA) { ucErrTime++; if(ucErrTime250) { LMP_IIC_Stop(); return 1; } } LMP_IIC_SCL=0;//时钟输出0 return 0; } /************************************************************************************************ ** 函数名称:LMP_IIC_Ack ** 输入参数:无 ** 输出参数:无 ** 功能描述:产生ACK应答 ************************************************************************************************/ void LMP_IIC_Ack(void) { LMP_IIC_SCL=0; LMP_SDA_OUT(); LMP_IIC_SDA=0; delay_us(2); LMP_IIC_SCL=1; delay_us(2); LMP_IIC_SCL=0; } /************************************************************************************************ ** 函数名称:LMP_IIC_NAck ** 输入参数:无 ** 输出参数:无 ** 功能描述:不产生ACK应答 ************************************************************************************************/ void LMP_IIC_NAck(void) { LMP_IIC_SCL=0; LMP_SDA_OUT(); LMP_IIC_SDA=1; delay_us(2); LMP_IIC_SCL=1; delay_us(2); LMP_IIC_SCL=0; } /************************************************************************************************ ** 函数名称:LMP_IIC_Send_Byte ** 输入参数:txd:发送数据 ** 输出参数:无 ** 功能描述:IIC发送一个字节。 ************************************************************************************************/ void LMP_IIC_Send_Byte(u8 txd) { u8 t; LMP_SDA_OUT(); LMP_IIC_SCL=0; //拉低时钟开始数据传输 for(t=0;t8;t++) { LMP_IIC_SDA=(txd0x80)7; txd=1; delay_us(2); //对LMP91000这三个延时都是必须的 LMP_IIC_SCL=1; delay_us(2); LMP_IIC_SCL=0; delay_us(2); } LMP_IIC_SDA = 0; } /************************************************************************************************ ** 函数名称:LMP_IIC_Read_Byte ** 输入参数:ack: = 1时,发送ACK ** = 0时,发送nACK ** 输出参数:返回读取IIC中的数据。 ** 功能描述:IIC读取一个字节。 ************************************************************************************************/ u8 LMP_IIC_Read_Byte(unsigned char ack) { unsigned char i,receive=0; LMP_SDA_IN(); //SDA设置为输入 for(i=0;i8;i++ ) { LMP_IIC_SCL=0; delay_us(2); LMP_IIC_SCL=1; receive=1; if(LMP_READ_SDA) receive++; delay_us(1); } if (!ack) LMP_IIC_NAck();//发送nACK else LMP_IIC_Ack(); //发送ACK return receive; } /************************************************************************************************ ** 函数名称:LMP_Init_Func ** 输入参数:无 ** 输出参数:无 ** 功能描述:通过IIC初始化ADS设置寄存器的值 ************************************************************************************************/ void LMP_Init_Func(void) { LMP_IIC_Start(); LMP_IIC_Send_Byte(LMP_WRITE_ADDE); //发送LMP91000地址 LMP+写操作位90 LMP_IIC_Wait_Ack(); LMP_IIC_Send_Byte(LMP_REG2_ADDE); //发送寄存器地址2 01 LMP_IIC_Wait_Ack(); LMP_IIC_Send_Byte(LMP_REG2_UNLOCK); //发送寄存器地址2中需要写入的数据 LMP_IIC_Wait_Ack(); LMP_IIC_Stop(); delay_us(8); LMP_IIC_Start(); LMP_IIC_Send_Byte(LMP_WRITE_ADDE); //发送LMP91000地址 LMP_IIC_Wait_Ack(); LMP_IIC_Send_Byte(LMP_REG3_ADDE); //发送寄存器地址2 10 LMP_IIC_Wait_Ack(); LMP_IIC_Send_Byte(LMP_REG3_DATA); //发送寄存器地址2中需要写入的数据 LMP_IIC_Wait_Ack(); LMP_IIC_Stop(); delay_us(8); LMP_IIC_Start(); LMP_IIC_Send_Byte(LMP_WRITE_ADDE); //发送LMP91000地址 LMP_IIC_Wait_Ack(); LMP_IIC_Send_Byte(LMP_REG4_ADDE); //发送寄存器地址2 11 LMP_IIC_Wait_Ack(); LMP_IIC_Send_Byte(LMP_REG4_DATA); //发送寄存器地址2中需要写入的数据 LMP_IIC_Wait_Ack(); LMP_IIC_Stop(); delay_us(8); LMP_IIC_Start(); LMP_IIC_Send_Byte(LMP_WRITE_ADDE); //发送LMP91000地址 LMP_IIC_Wait_Ack(); LMP_IIC_Send_Byte(LMP_REG5_ADDE); //发送寄存器地址2 12 LMP_IIC_Wait_Ack(); LMP_IIC_Send_Byte(LMP_REG5_DATA); //发送寄存器地址2中需要写入的数据 LMP_IIC_Wait_Ack(); LMP_IIC_Stop(); delay_us(8); LMP_IIC_Start(); LMP_IIC_Send_Byte(LMP_WRITE_ADDE); //发送LMP91000地址 LMP+写操作位 LMP_IIC_Wait_Ack(); LMP_IIC_Send_Byte(LMP_REG2_ADDE); //发送寄存器地址2 01 LMP_IIC_Wait_Ack(); LMP_IIC_Send_Byte(LMP_REG2_LOCK); //发送寄存器地址2中需要写入的数据 LMP_IIC_Wait_Ack(); LMP_IIC_Stop(); //产生一个停止条件 delay_ms(10); } /************************************************************************************************ ** 函数名称:LMP_Read_Func ** 输入参数:无 ** 输出参数:返回读取的ADS中数据 ** 功能描述:通过IIC读取ADS数据寄存器的值 ************************************************************************************************/ u16 LMP_Read_Func(void) { unsigned charun8Date; un8Date = 0; LMP_IIC_Start(); LMP_IIC_Send_Byte(LMP_WRITE_ADDE); //发送LMP91000地址 LMP_IIC_Wait_Ack(); LMP_IIC_Send_Byte(LMP_REG3_ADDE); //发送寄存器地址00 LMP_IIC_Wait_Ack(); LMP_IIC_Stop(); LMP_IIC_Start(); LMP_IIC_Send_Byte(LMP_READ_ADDE); //发送LMP91000地址 LMP_IIC_Wait_Ack(); un8Date = LMP_IIC_Read_Byte(0); LMP_IIC_Stop(); //产生一个停止条件 return (un8Date); } 3. MAIN.C int main(void) { delay_init(24); //延时初始化函数 RCC_Configuration(); //始终初始化函数 IIC_Init_Func(); //IIC初始化函数 LMP_IIC_Init_Func(); while (1) { G_un16ADCValue4 = ADC_Average(G_un16ADC_ConValue,3); G_un16V4Value4= (unsigned int)((unsigned long)G_un16ADCValue4 * 2480/4096); G_un16LMPValue = LMP_Read_Func(); } }

crh寄存器_寄存器-相关博客帖子 - 电子工程世界-论坛相关推荐

  1. 电子工程与计算机科学的读后感,读后感-相关博文 - 电子工程世界-论坛

    热度 1辛昕 2014-1-8 23:24 本来想写在 读书频道 的,因为没多少内容,然而,刚刚翻了翻,发现新版论坛 没了这个东西. 这本书的作者不是别人,正是大名鼎鼎的 比尔盖茨. windows9 ...

  2. c语言中0xof423什么意思,C语言-相关博文 - 电子工程世界-论坛

    liufan 2015-4-15 15:00 今天一时兴起,想写写对于指针的理解,希望能用最简单的语言,表达的清楚明白,更希望能帮到刚刚接触C指针的同学.写这还是蛮有 成就感的,我咋就不去当老师列? ...

  3. [博客阅读] 相关博客阅读

    文章阅读,从点到面,由浅到深. Vue相关博客阅读 [1] 关于 Vue.proxyTable 是干什么的?以及如何配置? - 简书 [2] Vue 简单状态管理-store模式 - lovin - ...

  4. 【camera】自动泊车-视觉车位检测相关资料汇总(论文、数据集、源代码、相关博客、演示demo)(1)

    [camera]自动泊车-视觉车位检测相关资料汇总(论文.数据集.源代码.相关博客.演示demo)parking slot detection 论文 2020论文 2019论文 2018论文 2017 ...

  5. 深入理解计算机系统 -资料整理 高清中文版_在所不辞的博客-CSDN博客_深入理解计算机系统第四版pdf

    深入理解计算机系统 -资料整理 高清中文版_在所不辞的博客-CSDN博客_深入理解计算机系统第四版pdf

  6. 邓文迪撑杆跳,甩开老公要独立?_富杂志_新浪博客

    邓文迪撑杆跳,甩开老公要独立?_富杂志_新浪博客 邓文迪撑杆跳,甩开老公要独立? (2010-01-11 10:55:22) 转载▼

  7. cadence spb 16.5 破解过程实例和使用感受_赤松子耶_新浪博客

    cadence spb 16.5 破解过程实例和使用感受_赤松子耶_新浪博客 Cadence Allegro16.5详细安装具体的步骤 1.下载SPB16.5下来后,点setup.exe,先安装第一项 ...

  8. 关于幂律分布的一个笔记_哈克_新浪博客

    关于幂律分布的一个笔记_哈克_新浪博客 关于幂律分布的一个笔记     (2011-03-02 18:12:27)     转载▼     标签:     幂律     二八法则     杂谈     ...

  9. vim高级技巧(split)_小花_新浪博客

    vim高级技巧(split)_小花_新浪博客    :res(ize) +N 把当前窗口高度增加N个像素    :res(ize) -N 把当前窗口高度减少N个像素    :vertical res( ...

最新文章

  1. Python--day5--常用模块
  2. 英国继银行被窃之后 信贷公司Wonga数十万客户数据被泄
  3. 解决使用mybatis分页插件PageHelper的一个报错问题
  4. cygwin使用笔记
  5. python3内存分析_调试和分析 - tracemalloc —- 跟踪内存分配 - 《Python 3.7 标准库》 - 书栈网 · BookStack...
  6. CTF入门指南(Capture the flag)
  7. UVa 11572 Unique snowflakes【滑动窗口】
  8. 【性能测试】:操作NMON的shell脚本
  9. tps5430应用电路详解_详解常用电阻的优缺点
  10. [2018.07.14 T1] B君的第四题
  11. r语言如何计算t分布临界值_第十二讲 R-配对样本t检验
  12. AI、Big Data、Cloud学习路线之百度智能云ABC初级认证(百度云智学院学习笔记)
  13. 第九章第四节 流体压强与流速的关系
  14. linux打开txt文件命令_Linux文件操作,这些命令可以搞定
  15. 15、ADS使用记录之耦合器设计
  16. 鸽了亿下下的游记——2022 GDOI普及组游记
  17. c语言找最大数字,C语言: 键盘输入任意10个整数,找出最大数及最大数的序号。...
  18. 音频(二) 基音周期与共振峰
  19. 图解 深入浅出JavaWeb:事务必会必知
  20. Apache Kylin(一)

热门文章

  1. Ubuntu20.04用gparted软件给/目录 or /home目录扩容 or 压缩
  2. 阿里云服务器带宽下载上传速度表(1Mbps是128KB/s)
  3. Python语言-NL-数值运算
  4. anaconda下安装pytorch超详细步骤(有问题可以在评论区提问会及时解答)
  5. 阿里云服务器 安装下载工具aira2步骤
  6. 正压控制单元KA5000F/风机节能仪KA5000F
  7. 使用晨曦记账本,认识记账的重要性
  8. 宇宙代码与磁子计算机,新认识!宇宙产生什么最强磁铁?比人类产生的最强磁场强一亿倍...
  9. 设计中的确定性与不确定性思考
  10. 【全】在 Docker 的Solr容器中安装 IK 中文分词器