crh寄存器_寄存器-相关博客帖子 - 电子工程世界-论坛
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寄存器_寄存器-相关博客帖子 - 电子工程世界-论坛的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 致:视频监控、车载导航的用户,听说你想买
- 下一篇: 【PC】通过BAT批处理来更改IE代理设