bluesky8059

Untitled

May 25th, 2016
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.98 KB | None | 0 0
  1. /*********************************************************************
  2. Function : InitialSensor
  3. Purpose : sensor initialization
  4. Parameter : none
  5. Return value : none
  6. *********************************************************************/
  7. void InitialSensor(int sample_rate_div,int low_pass_filter)
  8. {
  9.   U8 tmpRead[3] = {0};
  10.   U8 MPU_Init_Data[][3] = {
  11.         {PWR_MGMT_1,        0x80, 2},     // [0]  Reset Device
  12.         {PWR_MGMT_1,        0x01, 2},     // [1]  Clock Source
  13.         {INT_PIN_CFG,       0x10, 2},    // [2]  Set INT_ANYRD_2CLEAR
  14.         {INT_ENABLE,        0x01, 2},     // [3]  Set RAW_RDY_EN
  15.         {PWR_MGMT_2,        0x00, 2},     // [4]  Enable Acc & Gyro
  16.         {SMPLRT_DIV,        0x00, 2},     // [5]  Sample Rate Divider
  17.         {GYRO_CONFIG,       0x18, 2},    // [6]  default : +-2000dps
  18.         {ACCEL_CONFIG,      0x08, 2},   // [7]  default : +-4G
  19.         {CONFIG,            low_pass_filter, 2},         // [8]  default : LPS_41Hz
  20.         {ACCEL_CONFIG_2,    0x03, 2}, // [9]  default : LPS_41Hz
  21.         {USER_CTRL,         0x30, 2}      // [10] Set I2C_MST_EN, I2C_IF_DIS  
  22. };
  23.  
  24.     U8 i,j,u8InitCnt;
  25.     U8 u8len = sizeof(MPU_Init_Data) / 3;
  26.    
  27.     unsigned char testAcc, testGyro;
  28.    
  29.     if(g_Main.SysPar.SysID > 0)
  30.     {
  31.         u8InitCnt = 1;
  32.     }
  33.     else
  34.     {
  35.         u8InitCnt = 18;
  36.     }
  37.    
  38.     SPI_CLK_SLOW();
  39.    
  40.     for(j=0; j<u8InitCnt; j++)
  41.     {
  42.         for(i=0; i<u8len; i++)
  43.         {
  44.             WriteReg(0,MPU_Init_Data[i][0], MPU_Init_Data[i][1]);
  45.             MPU_Init_Data[i][1] = 0;
  46.             // delay
  47.             Delayms(MPU_Init_Data[i][2]);
  48.         }
  49.         set_acc_scale(g_Main.AccScale);
  50.         set_gyro_scale(g_Main.GyroScale);
  51.         //calib_mag();
  52.     }
  53.    
  54.     WriteMagReg(0, AK8963_CNTL2, 0x01);       // Reset Device
  55.     Delayms(2);
  56.     WriteMagReg(0, AK8963_CNTL1, 0x10);       // Power-down mode
  57.     Delayms(2);
  58.     WriteMagReg(0, AK8963_CNTL1, 0x1F);       // Fuse ROM access mode
  59.     Delayms(2);
  60.     ReadMagRegs(0, AK8963_ASAX, tmpRead, 3);  // Read sensitivity adjustment values
  61.     Delayms(2);
  62.     WriteMagReg(0, AK8963_CNTL1, 0x10);       // Power-down mode
  63.     Delayms(2);
  64.    
  65.    
  66.     WriteReg(0, I2C_MST_CTRL, 0x5D);
  67.     Delayms(2);
  68.     WriteReg(0, I2C_SLV0_ADDR, AK8963_I2C_ADDR | 0x80);
  69.     Delayms(2);
  70.     WriteReg(0, I2C_SLV0_REG, AK8963_ST1);
  71.     Delayms(2);
  72.     WriteReg(0, I2C_SLV0_CTRL, I2C_SLVx_EN | 8);
  73.     Delayms(2);
  74.  
  75.     WriteMagReg(0, AK8963_CNTL1, 0x16);       // Continuous measurement mode 2
  76.     Delayms(2);
  77.  
  78.     WriteReg(0, I2C_SLV4_CTRL, 0x09);
  79.     Delayms(2);
  80.     WriteReg(0, I2C_MST_DELAY_CTRL, 0x81);
  81.     Delayms(100);
  82.    
  83.         /*
  84.         WriteReg(0, I2C_SLV0_REG, AK8963_ST1);
  85.         WriteReg(0, I2C_SLV0_ADDR, AK8963_I2C_ADDR | 0x80);
  86.         WriteReg(0, I2C_SLV0_CTRL, 0x80 | 8);*/
  87.     //WriteReg(0,ACCEL_CONFIG,      BITS_FS_4G);
  88.     //WriteReg(0,GYRO_CONFIG,       BITS_FS_2000DPS);
  89.     SPI_CLK_FAST();
  90.     Delayms(10);
  91. }
  92.  
  93.  
  94. /*********************************************************************
  95. Function : ReadMagRegs
  96. Purpose : Sensor write register function
  97. Parameter : [in]U8 num -> sensor number
  98.             [in]U8 buffer -> data buffer
  99.             [in]U8 len -> length
  100. Return value : None
  101. *********************************************************************/
  102. void ReadMagRegs(U8 num, U8 addr, U8 *buffer, U8 len)
  103. {
  104.   U8 status = 0;
  105.   uint32_t timeout = 256;
  106.  
  107.   WriteReg(num, I2C_SLV4_ADDR, AK8963_I2C_ADDR | 0x80);
  108.   Delayms(1);
  109.   for(U8 i = 0; i< len; i++) {
  110.     WriteReg(num, I2C_SLV4_REG, addr + i);
  111.     Delayms(1);
  112.     WriteReg(num, I2C_SLV4_CTRL, I2C_SLVx_EN);
  113.     Delayms(1);
  114.  
  115.     do {
  116.       status = ReadReg(num, I2C_MST_STATUS);
  117.     } while(((status & I2C_SLV4_DONE) == 0) && (timeout--));
  118.  
  119.     buffer[i] = ReadReg(num, I2C_SLV4_DI);
  120.     Delayms(1);
  121.   }
  122. }
  123.  
  124.  
  125.  
  126. /*********************************************************************
  127. Function : WriteMagReg
  128. Purpose : Sensor write register function
  129. Parameter : [in]U8 num -> sensor number
  130.             [in]U8 reg -> register address
  131.             [in]U8 value -> Register value
  132. Return value : None
  133. *********************************************************************/
  134. void WriteMagReg(U8 num,U8 reg,U8 value)
  135. {
  136.     uint8_t  status = 0;
  137.     uint32_t timeout = 256;
  138.    
  139.     WriteReg(num,I2C_SLV4_ADDR,AK8963_I2C_ADDR);  //Set the I2C slave addres of AK8963 and set for write.
  140.     Delayus(1);
  141.     WriteReg(num,I2C_SLV4_REG, reg);     //I2C slave 0 register address from where to begin data transfer
  142.     Delayus(1);
  143.     WriteReg(num,I2C_SLV4_DO, value);
  144.     Delayus(1);
  145.     WriteReg(num,I2C_SLV4_CTRL, READ_FLAG);  //Enable I2C and set 1 byte
  146.    
  147.     do {
  148.         status = ReadReg(0, I2C_MST_STATUS);
  149.         Delayms(1);
  150.   } while(((status & 0x40) == 0) && (timeout--));
  151. }
  152.  
  153.  
  154. void ReadAll(int num)
  155. {
  156.   uint8_t response[22] = {0};
  157.     int16_t bit_data;
  158.     float data;
  159.     int i;
  160.  
  161.    
  162.     CS_Func(LOW,num);
  163.  
  164.     if(num > 0)
  165.     {
  166.         UCA0BurstRead(ACCEL_XOUT_H,22,response);  
  167.     }
  168.     else
  169.     {
  170.         UCB1BurstRead(ACCEL_XOUT_H,22,response);
  171.     }
  172.     CS_Func(HIGH,num);
  173.    
  174.     MoveData(&response[0], g_Main.AccTmp, 6);
  175.     MoveData(&response[6], g_Main.TemperatureTmp, 2);
  176.     MoveData(&response[8], g_Main.GyroTmp, 6);
  177.    
  178.     if(!(!(response[14] & AK8963_STATUS_DRDY) || (response[14] & AK8963_STATUS_DOR) || (response[21] & AK8963_STATUS_HOFL)))
  179.     {
  180.        MoveData(&response[16], &g_Main.MagTmp[0], 1);
  181.        MoveData(&response[15], &g_Main.MagTmp[1], 1);
  182.        MoveData(&response[18], &g_Main.MagTmp[2], 1);
  183.        MoveData(&response[17], &g_Main.MagTmp[3], 1);
  184.        MoveData(&response[20], &g_Main.MagTmp[4], 1);
  185.        MoveData(&response[19], &g_Main.MagTmp[5], 1);
  186.     }
  187.    
  188.     MoveData(g_Main.AccTmp, &g_Data_Packet.PacketBuf[8], 6);
  189.     MoveData(g_Main.GyroTmp, &g_Data_Packet.PacketBuf[14], 6);
  190.     MoveData(g_Main.MagTmp, &g_Data_Packet.PacketBuf[20], 6);
  191.     UartTXSend(g_Data_Packet.PacketBuf, 26);
  192.     PWR_LED_OFF;
  193. }
Advertisement
Add Comment
Please, Sign In to add comment