YKNCT / YKNCT_I2C_lib

Dependents:   arim_AutoMachine

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers YKNCT_I2C.cpp Source File

YKNCT_I2C.cpp

00001 #include "YKNCT_I2C.h"
00002 
00003 Y_I2C::Y_I2C(PinName sda, PinName scl) : i2c(sda, scl)
00004 {
00005   
00006     i2c.frequency(100000);
00007 }
00008 
00009 void Y_I2C::Out_Set(OUT_I2C_Data_TypeDef *OUT_I2C_Data, uint8_t num, uint8_t value)
00010 {
00011     (OUT_I2C_Data+num) -> out_data =value;
00012 }
00013 
00014 void Y_I2C::Out(OUT_I2C_Data_TypeDef *OUT_I2C_Data, uint8_t MAX)
00015 {
00016     int cnt=0; //何個出力したかを保存する
00017     int ad_cnt=0; //同じアドレスの数を保存する
00018     while(cnt<MAX) {
00019         char data=0;
00020         int tmp_address=(OUT_I2C_Data+cnt)->DevAddress;
00021         
00022         //同じアドレスの数を数える
00023         for(ad_cnt=0;; ad_cnt++) {
00024             if(tmp_address!=(OUT_I2C_Data+cnt+ad_cnt)->DevAddress)
00025                 break;
00026         }
00027         //一枚の基板に出力するデータを格納する
00028         for(int j=0; j<ad_cnt; j++) data|=(OUT_I2C_Data+cnt+j)->out_data<<j;
00029 
00030         i2c.write(((OUT_I2C_Data+cnt)->DevAddress)<<1, &data, 1);
00031         cnt+=ad_cnt;
00032     }
00033 }
00034 
00035 void Y_I2C::Servo_Set(SERVO_I2C_Data_TypeDef *SERVO_I2C_Data, uint8_t num, uint16_t pulse)
00036 {
00037     (SERVO_I2C_Data+num)->pulse=pulse;
00038 }
00039 
00040 //4biteづつ送信する
00041 void Y_I2C::Servo(SERVO_I2C_Data_TypeDef *SERVO_I2C_Data, uint8_t MAX)
00042 {
00043     for(int i=0; i<(MAX+1)/2; i++) {
00044         char data[4]= {0};
00045         
00046         //MAXが奇数で最後の時
00047         if(i==MAX/2 && MAX%2==1) {
00048             for(int j=0; j<2; j++)
00049                 //16bitのpulse1つを8bitづつに分けてdataに保存する
00050                 data[j]=(SERVO_I2C_Data+i*2+j/2)->pulse>>(1-j%2)*8;
00051         } else {
00052             for(int j=0; j<4; j++)
00053                 //16bitのpulse2つを8bitづつに分けてdataに保存する
00054                 data[j]=(SERVO_I2C_Data+i*2+j/2)->pulse>>(1-j%2)*8;
00055         }
00056         i2c.write(((SERVO_I2C_Data+i)->DevAddress+93)<<1, data, 4);
00057     }
00058 }
00059 
00060 void Y_I2C::In(IN_I2C_Data_TypeDef *IN_I2C_Data, uint8_t num)
00061 {
00062     char data;
00063     uint8_t array=(IN_I2C_Data+num)->Number;
00064 
00065     i2c.read(((IN_I2C_Data+num)->DevAddress+25)<<1, &data, 1);
00066 
00067     (IN_I2C_Data+num)->in_data=data&1<<array;
00068 }
00069 
00070 void Y_I2C::Adc(ADC_I2C_Data_TypeDef *ADC_I2C_Data, uint8_t num)
00071 {
00072     char data[8]= {0};
00073     uint8_t array=(ADC_I2C_Data+num)->Number;
00074 //  adc 42 line 110
00075     i2c.read((((ADC_I2C_Data+num) -> DevAddress)+42)<<1, data, 8);
00076 
00077     (ADC_I2C_Data+num)->adc_data=data[array*2+1]<<8|data[array*2];
00078 }
00079 
00080 void Y_I2C::Enc(ENC_I2C_Data_TypeDef *ENC_I2C_Data, uint8_t num)
00081 {
00082     char data[4]= {0};
00083 
00084     i2c.read(((ENC_I2C_Data+num) -> DevAddress+76)<<1, data, 4);
00085 
00086     (ENC_I2C_Data+num)->enc_data=data[3]<<24|data[2]<<16|data[1]<<8|data[0];
00087 }
00088 
00089 void Y_I2C::MD_I2C(MD_I2C_Data_TypeDef *MD_I2C_Data, uint8_t num)
00090 {
00091     /* 送信データ
00092       [0] [ MD出力更新 | 0 | 0 | 0 | 0 | ブレーキ | 回転方向 | MD指定 ]
00093       [1] PWM値(7bit)
00094     */
00095 
00096     /* 送信データをMD更新フラグを立てて初期化 */
00097     (MD_I2C_Data + num)->pData[0] = 0x80;
00098     /* モーターの駆動状態によってデータセット */
00099     switch (MD_GET_DRIVE(MD_I2C_Data, num)) {
00100         /* ブレーキ,ブレーキビット 1,回転方向ビット 0 */
00101         /* 0b00000100 */
00102         case MD_BRAKE:
00103             (MD_I2C_Data + num)->pData[0] |= 0x02 << 1;
00104             break;
00105         /* 正転,ブレーキビット 0,回転方向ビット 1 */
00106         /* 0b00000001 */
00107         case MD_FORWARD:
00108             (MD_I2C_Data + num)->pData[0] |= 0x01 << 1;
00109             break;
00110         /* 逆転,ブレーキビット 0,回転方向ビット 0 */
00111         /* 0b00000000 */
00112         case MD_REVERSE:
00113             (MD_I2C_Data + num)->pData[0] |= 0x00 << 1;
00114             break;
00115     }
00116 
00117     /* PIC上の出力番号を指定 */
00118     /* 0b00000000 or 0b00000001 */
00119     (MD_I2C_Data + num)->pData[0] |= (MD_I2C_Data + num)->Number;
00120     /* PWM値が100より大きかったら範囲内に補正 */
00121     if (MD_GET_PWM(MD_I2C_Data, num) > 99)
00122         MD_SET_PWM(MD_I2C_Data, num, 99);
00123 
00124     /* PWM(0~100)を0~127に変換して代入(オーバーフロー防止で16bitに一時変換) */
00125     (MD_I2C_Data + num)->pData[1] = (uint8_t)((uint16_t)MD_GET_PWM(MD_I2C_Data, num) * 127 / 100);
00126 
00127     /*8bitから7bitに変換*/
00128     i2c.write((MD_I2C_Data + num)->DevAddress << 1,(MD_I2C_Data + num)->pData,2);
00129 }
00130 
00131 /**
00132   * @brief  MDに通信確認用送信
00133   * @param  MD_I2C_Data: I2C式MDデータ構造
00134   * @param  num: 使用MD番号
00135   * @retval なし
00136   * @detail I2C式MD側が通信が切れていないことを確認するために空データを送信する
00137   */
00138 void Y_I2C::MD_I2C_Empty(MD_I2C_Data_TypeDef *MD_I2C_Data, uint8_t num)
00139 {
00140     /* 送信データをMD更新フラグを立てず初期化 */
00141     (MD_I2C_Data+num)->pData[0] = 0;
00142 
00143     /* PIC上の出力番号を指定 */
00144     /* 0b00000000 or 0b00000001 */
00145     (MD_I2C_Data+num)->pData[0] |= (MD_I2C_Data+num)->Number;
00146 
00147     /*8bitから7bitに変換*/
00148     i2c.write((MD_I2C_Data + num)->DevAddress << 1,(MD_I2C_Data + num)->pData,2);
00149 }