|
楼主 |
发表于 2017-11-22 16:30:53
|
显示全部楼层
普通的SPI操作就不用写了,现在附上关键的代码,无非就是校正,测试读写,和流量检测。
- //校正高速晶振
- unsigned long gp22_cal_OSC(void)
- {
- unsigned long temp,result = 0;
- unsigned int err = 0;
- uint8_t i = 0, CLK32K_cycles_set = 1;
-
- GP22_EN_START_1; /// In calibrate resonator, EN_START pin must be to set 1.
- gp22_write_1byte(INIT_MEASURE); /// Init GP22 measure.
- gp22_write_1byte(START_CAL_OSC); /// Calibrate resonator.
- while( 0 == g_GP22InterruptFlag );
- g_GP22InterruptFlag = 0;
- g_GP22StatusRegister = gp22_Read_2byte(READ_STAT);
- //time out check
- if( g_GP22StatusRegister&0x0600 )
- {
- if(g_GP22StatusRegister&0x0200)
- {
- err = 1;//printf("TDC_OUT",0,0);
- }
- if(g_GP22StatusRegister&0x0400)
- {
- err = 2; //printf("PRE_OUT",0,0);
- }
- }
- ///根据状态来读
- i = g_GP22StatusRegister;
- --i;
- i &= 0x03;
- switch(i)
- {
- case 0:result = gp22_Read_4byte(0xb0);break;
- case 1:result = gp22_Read_4byte(0xb1);break;
- case 2:result = gp22_Read_4byte(0xb2);break;
- case 3:result = gp22_Read_4byte(0xb3);break;
- }
-
- //CLK32K_cycles_set -> ANZ_PER_CALRES即32.768K的周期数, 0,1,2,3
- CLK32K_cycles_set = 1;
- switch(CLK32K_cycles_set)
- {
- case 0:
- if((result<0x1B80000)||(result>0x2080000))//t<55uS?t>65uS err
- {
- // printf("Err_61.035uS_cal",0,1);
- // printf("status reg :",status,1);//status
- err = 3;
- }
- break;
- case 1:
- if((result<0x3700000)||(result>0x4100000))//t<110uS?t>130uS err
- {
- // printf("Err_122.07uS_cal",0,1);
- // printf("status reg:",status,1);//status
- err = 4;
- }
- break;
- case 2:
- if((result<0x6E00000)||(result>0x8200000))//t<220uS?t>260uS err
- {
- // printf("Err_244.14uS_cal",0,1);
- // printf("status reg:",status,1);//status
- err = 5;
- }
- break;
- case 3:
- if((result<0xDC00000)||(result>0x10400000))//t<440uS?t>520uS err
- {
- // printf("Err_488.281uS_cal",0,1);
- // printf("status reg:",status,1);//status
- err = 6;
- }
- break;
- }
-
- if(err != 0)
- return 1;
- return 0;
- }
- /*************************************************/
- //功能:测试GP22的通信是否成功
- /*************************************************/
- unsigned char gp22_comm_test(void)
- {
- unsigned char counter = 0;
- unsigned long tmp1 = 0,tmp2 = 0;
-
- ///先写寄存器0x81
- ///再读结果寄存器5,反映寄存器1 的高8 位
- ///测试3次,0xAA,0x55,0xc3
- tmp1 = 0xA5000000 ;
- gp22_write_4byte(WRITE_REG1,tmp1); //往寄存器1,写入数据
- waitms(5);
- tmp2 = gp22_Read_4byte(READ_REG5); //从寄存器0xb5,读出来的高8位,和刚才写入的数据相等 -> 才是正确的读写
- if(tmp1 == tmp2)
- counter++;
- tmp1 = 0x5A000000 ;
- gp22_write_4byte(WRITE_REG1,tmp1); //往寄存器1,写入数据
- waitms(5);
- tmp2 = gp22_Read_4byte(READ_REG5); //从寄存器0xb5,读出来的高8位,和刚才写入的数据相等 -> 才是正确的读写
- if(tmp1 == tmp2)
- counter++;
- tmp1 = 0xc3000000 ;
- gp22_write_4byte(WRITE_REG1,tmp1); //往寄存器1,写入数据
- waitms(5);
- tmp2 = gp22_Read_4byte(READ_REG5); //从寄存器0xb5,读出来的高8位,和刚才写入的数据相等 -> 才是正确的读写
- if(tmp1 == tmp2 )
- counter++;
- if(counter >= 3)
- return 1;
- return 0;
-
- }
- // 具体步骤参照 gp22_v1.2.pdf 和 AN032_en.pdf
- void gp22_TOF_ultrasonic(void)
- {
- unsigned int i;
- unsigned long temp;
- long tempValueBuffer[10]; // 排序,求平均
- unsigned j, k;
- long tempValue;
- long tempValueSum = 0;
- float tempValue1; // 串口输出显示
-
- //1. 硬件初始化
- GP22_START_1;
- GP22_EN_STOP1_1;
- GP22_EN_STOP2_1;
- GP22_EN_START_1;
- GP22_RESET_1;
- gp22_spi_init(); //spi init
- gp22_Hard_Reset(); //reset gpio
- waitms(10);
- gp22_write_1byte(POWER_ON_RESET); //0x50
- waitms(10);
- gp22_comm_test(); //额外添加测试
-
- //gp22_Reg_Init();
- gp22_write_4byte( WRITE_REG0, 0x43CBE800);
- gp22_write_4byte( WRITE_REG1, 0x21444000 );
- gp22_write_4byte( WRITE_REG2, 0xA0190000 );
- gp22_write_4byte( WRITE_REG3, 0xF8A24800 );
- gp22_write_4byte( WRITE_REG4, 0x20004000 );
- gp22_write_4byte( WRITE_REG5, 0x40000000 );
- gp22_write_4byte( WRITE_REG6, 0xC0C06100 );
-
-
- //2. 校准
- gp22_cal_OSC(); //0x03, Cal_Resonator
-
- //3. 温度测试,暂时不用
-
- //4. 循环测试
- while(1)
- {
- gp22_write_1byte(INIT_MEASURE); //0x70
- // gp22_write_1byte(START_TOF_RESTART); //0x05,没波形?
- gp22_write_1byte(START_TOF); //有波形,这是什么鬼?
-
- while( 0 == g_GP22InterruptFlag );
- g_GP22InterruptFlag = 0;
- g_GP22StatusRegister = gp22_Read_2byte(READ_STAT); //0xb4
- // Error
- if( (g_GP22StatusRegister & 0x0600) != 0x0000 ) /// Timeout error.
- {
- g_downTimeOutFlag = 1; /// 空管断
- }
- else
- {
- temp = gp22_Read_4byte(READ_RES3); //0xb3
- g_timeResult3 = dotHextoDotDec(temp);
- g_averageTimeResultDown = g_timeResult3/3;
- }
-
- gp22_write_1byte(INIT_MEASURE); //0x70
- while( 0 == g_GP22InterruptFlag );
- g_GP22InterruptFlag = 0;
- g_GP22StatusRegister = gp22_Read_2byte(READ_STAT); //0xb4
- // Error
- if( (g_GP22StatusRegister & 0x0600) != 0x0000 ) /// Timeout error.
- {
- g_upTimeOutFlag = 1; /// 空管断
- }
- else
- {
- temp = gp22_Read_4byte(READ_RES3); //0xb3
- g_timeResult3 = dotHextoDotDec(temp);
- g_averageTimeResultUp = g_timeResult3/3;
- }
-
- gp22_cal_OSC(); //重新校验
-
- g_PW1STValue = gp22_Read_PW1ST(); //0xb8, < 0.3 ,alarm
-
- if( (0 == g_downTimeOutFlag) && (0 == g_upTimeOutFlag) )
- {
- ;//add user code , cal vol
- }
- else
- {
- g_downTimeOutFlag = 0;
- g_upTimeOutFlag = 0;
- gp22_Reg_Init();
- }
- }
- }
复制代码 |
|