![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
a
YKNCT_I2C_lib/YKNCT_I2C.cpp@0:761a63c6d020, 2019-08-22 (annotated)
- Committer:
- Tom0108
- Date:
- Thu Aug 22 09:26:20 2019 +0000
- Revision:
- 0:761a63c6d020
08/22
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Tom0108 | 0:761a63c6d020 | 1 | #include "YKNCT_I2C.h" |
Tom0108 | 0:761a63c6d020 | 2 | |
Tom0108 | 0:761a63c6d020 | 3 | Y_I2C::Y_I2C(PinName sda, PinName scl) : i2c(sda, scl) |
Tom0108 | 0:761a63c6d020 | 4 | { |
Tom0108 | 0:761a63c6d020 | 5 | i2c.frequency(100000); |
Tom0108 | 0:761a63c6d020 | 6 | } |
Tom0108 | 0:761a63c6d020 | 7 | |
Tom0108 | 0:761a63c6d020 | 8 | void Y_I2C::Out_Set(OUT_I2C_Data_TypeDef *OUT_I2C_Data, uint8_t num, uint8_t value) |
Tom0108 | 0:761a63c6d020 | 9 | { |
Tom0108 | 0:761a63c6d020 | 10 | (OUT_I2C_Data+num) -> out_data =value; |
Tom0108 | 0:761a63c6d020 | 11 | } |
Tom0108 | 0:761a63c6d020 | 12 | |
Tom0108 | 0:761a63c6d020 | 13 | void Y_I2C::Out(OUT_I2C_Data_TypeDef *OUT_I2C_Data, uint8_t MAX) |
Tom0108 | 0:761a63c6d020 | 14 | { |
Tom0108 | 0:761a63c6d020 | 15 | int cnt=0; //何個出力したかを保存する |
Tom0108 | 0:761a63c6d020 | 16 | int ad_cnt=0; //同じアドレスの数を保存する |
Tom0108 | 0:761a63c6d020 | 17 | while(cnt<MAX) { |
Tom0108 | 0:761a63c6d020 | 18 | char data=0; |
Tom0108 | 0:761a63c6d020 | 19 | int tmp_address=(OUT_I2C_Data+cnt)->DevAddress+59; |
Tom0108 | 0:761a63c6d020 | 20 | |
Tom0108 | 0:761a63c6d020 | 21 | //同じアドレスの数を数える |
Tom0108 | 0:761a63c6d020 | 22 | for(ad_cnt=0;; ad_cnt++) { |
Tom0108 | 0:761a63c6d020 | 23 | if(tmp_address!=(OUT_I2C_Data+cnt+ad_cnt)->DevAddress+59) |
Tom0108 | 0:761a63c6d020 | 24 | break; |
Tom0108 | 0:761a63c6d020 | 25 | } |
Tom0108 | 0:761a63c6d020 | 26 | //一枚の基板に出力するデータを格納する |
Tom0108 | 0:761a63c6d020 | 27 | for(int j=0; j<ad_cnt; j++) data|=(OUT_I2C_Data+cnt+j)->out_data<<j; |
Tom0108 | 0:761a63c6d020 | 28 | |
Tom0108 | 0:761a63c6d020 | 29 | i2c.write(((OUT_I2C_Data+cnt)->DevAddress+59)<<1, &data, 1); |
Tom0108 | 0:761a63c6d020 | 30 | cnt+=ad_cnt; |
Tom0108 | 0:761a63c6d020 | 31 | } |
Tom0108 | 0:761a63c6d020 | 32 | } |
Tom0108 | 0:761a63c6d020 | 33 | |
Tom0108 | 0:761a63c6d020 | 34 | void Y_I2C::Servo_Set(SERVO_I2C_Data_TypeDef *SERVO_I2C_Data, uint8_t num, uint16_t pulse) |
Tom0108 | 0:761a63c6d020 | 35 | { |
Tom0108 | 0:761a63c6d020 | 36 | (SERVO_I2C_Data+num)->pulse=pulse; |
Tom0108 | 0:761a63c6d020 | 37 | } |
Tom0108 | 0:761a63c6d020 | 38 | |
Tom0108 | 0:761a63c6d020 | 39 | //4biteづつ送信する |
Tom0108 | 0:761a63c6d020 | 40 | void Y_I2C::Servo(SERVO_I2C_Data_TypeDef *SERVO_I2C_Data, uint8_t MAX) |
Tom0108 | 0:761a63c6d020 | 41 | { |
Tom0108 | 0:761a63c6d020 | 42 | for(int i=0; i<(MAX+1)/2; i++) { |
Tom0108 | 0:761a63c6d020 | 43 | char data[4]= {0}; |
Tom0108 | 0:761a63c6d020 | 44 | |
Tom0108 | 0:761a63c6d020 | 45 | //MAXが奇数で最後の時 |
Tom0108 | 0:761a63c6d020 | 46 | if(i==MAX/2 && MAX%2==1) { |
Tom0108 | 0:761a63c6d020 | 47 | for(int j=0; j<2; j++) |
Tom0108 | 0:761a63c6d020 | 48 | //16bitのpulse1つを8bitづつに分けてdataに保存する |
Tom0108 | 0:761a63c6d020 | 49 | data[j]=(SERVO_I2C_Data+i*2+j/2)->pulse>>(1-j%2)*8; |
Tom0108 | 0:761a63c6d020 | 50 | } else { |
Tom0108 | 0:761a63c6d020 | 51 | for(int j=0; j<4; j++) |
Tom0108 | 0:761a63c6d020 | 52 | //16bitのpulse2つを8bitづつに分けてdataに保存する |
Tom0108 | 0:761a63c6d020 | 53 | data[j]=(SERVO_I2C_Data+i*2+j/2)->pulse>>(1-j%2)*8; |
Tom0108 | 0:761a63c6d020 | 54 | } |
Tom0108 | 0:761a63c6d020 | 55 | i2c.write(((SERVO_I2C_Data+i)->DevAddress+93)<<1, data, 4); |
Tom0108 | 0:761a63c6d020 | 56 | } |
Tom0108 | 0:761a63c6d020 | 57 | } |
Tom0108 | 0:761a63c6d020 | 58 | |
Tom0108 | 0:761a63c6d020 | 59 | void Y_I2C::In(IN_I2C_Data_TypeDef *IN_I2C_Data, uint8_t num) |
Tom0108 | 0:761a63c6d020 | 60 | { |
Tom0108 | 0:761a63c6d020 | 61 | char data; |
Tom0108 | 0:761a63c6d020 | 62 | uint8_t array=(IN_I2C_Data+num)->Number; |
Tom0108 | 0:761a63c6d020 | 63 | |
Tom0108 | 0:761a63c6d020 | 64 | i2c.read(((IN_I2C_Data+num)->DevAddress+25)<<1, &data, 1); |
Tom0108 | 0:761a63c6d020 | 65 | |
Tom0108 | 0:761a63c6d020 | 66 | (IN_I2C_Data+num)->in_data=data&1<<array; |
Tom0108 | 0:761a63c6d020 | 67 | } |
Tom0108 | 0:761a63c6d020 | 68 | |
Tom0108 | 0:761a63c6d020 | 69 | void Y_I2C::Adc(ADC_I2C_Data_TypeDef *ADC_I2C_Data, uint8_t num) |
Tom0108 | 0:761a63c6d020 | 70 | { |
Tom0108 | 0:761a63c6d020 | 71 | char data[8]= {0}; |
Tom0108 | 0:761a63c6d020 | 72 | uint8_t array=(ADC_I2C_Data+num)->Number; |
Tom0108 | 0:761a63c6d020 | 73 | // adc 42 line 110 |
Tom0108 | 0:761a63c6d020 | 74 | i2c.read((((ADC_I2C_Data+num) -> DevAddress)+42)<<1, data, 8); |
Tom0108 | 0:761a63c6d020 | 75 | |
Tom0108 | 0:761a63c6d020 | 76 | (ADC_I2C_Data+num)->adc_data=data[array*2+1]<<8|data[array*2]; |
Tom0108 | 0:761a63c6d020 | 77 | } |
Tom0108 | 0:761a63c6d020 | 78 | |
Tom0108 | 0:761a63c6d020 | 79 | void Y_I2C::Enc(ENC_I2C_Data_TypeDef *ENC_I2C_Data, uint8_t num) |
Tom0108 | 0:761a63c6d020 | 80 | { |
Tom0108 | 0:761a63c6d020 | 81 | char data[4]= {0}; |
Tom0108 | 0:761a63c6d020 | 82 | |
Tom0108 | 0:761a63c6d020 | 83 | i2c.read(((ENC_I2C_Data+num) -> DevAddress+76)<<1, data, 4); |
Tom0108 | 0:761a63c6d020 | 84 | |
Tom0108 | 0:761a63c6d020 | 85 | (ENC_I2C_Data+num)->enc_data=data[3]<<24|data[2]<<16|data[1]<<8|data[0]; |
Tom0108 | 0:761a63c6d020 | 86 | } |
Tom0108 | 0:761a63c6d020 | 87 | |
Tom0108 | 0:761a63c6d020 | 88 | void Y_I2C::MD_I2C(MD_I2C_Data_TypeDef *MD_I2C_Data, uint8_t num) |
Tom0108 | 0:761a63c6d020 | 89 | { |
Tom0108 | 0:761a63c6d020 | 90 | /* 送信データ |
Tom0108 | 0:761a63c6d020 | 91 | [0] [ MD出力更新 | 0 | 0 | 0 | 0 | ブレーキ | 回転方向 | MD指定 ] |
Tom0108 | 0:761a63c6d020 | 92 | [1] PWM値(7bit) |
Tom0108 | 0:761a63c6d020 | 93 | */ |
Tom0108 | 0:761a63c6d020 | 94 | |
Tom0108 | 0:761a63c6d020 | 95 | /* 送信データをMD更新フラグを立てて初期化 */ |
Tom0108 | 0:761a63c6d020 | 96 | (MD_I2C_Data + num)->pData[0] = 0x80; |
Tom0108 | 0:761a63c6d020 | 97 | /* モーターの駆動状態によってデータセット */ |
Tom0108 | 0:761a63c6d020 | 98 | switch (MD_GET_DRIVE(MD_I2C_Data, num)) { |
Tom0108 | 0:761a63c6d020 | 99 | /* ブレーキ,ブレーキビット 1,回転方向ビット 0 */ |
Tom0108 | 0:761a63c6d020 | 100 | /* 0b00000100 */ |
Tom0108 | 0:761a63c6d020 | 101 | case MD_BRAKE: |
Tom0108 | 0:761a63c6d020 | 102 | (MD_I2C_Data + num)->pData[0] |= 0x02 << 1; |
Tom0108 | 0:761a63c6d020 | 103 | break; |
Tom0108 | 0:761a63c6d020 | 104 | /* 正転,ブレーキビット 0,回転方向ビット 1 */ |
Tom0108 | 0:761a63c6d020 | 105 | /* 0b00000001 */ |
Tom0108 | 0:761a63c6d020 | 106 | case MD_FORWARD: |
Tom0108 | 0:761a63c6d020 | 107 | (MD_I2C_Data + num)->pData[0] |= 0x01 << 1; |
Tom0108 | 0:761a63c6d020 | 108 | break; |
Tom0108 | 0:761a63c6d020 | 109 | /* 逆転,ブレーキビット 0,回転方向ビット 0 */ |
Tom0108 | 0:761a63c6d020 | 110 | /* 0b00000000 */ |
Tom0108 | 0:761a63c6d020 | 111 | case MD_REVERSE: |
Tom0108 | 0:761a63c6d020 | 112 | (MD_I2C_Data + num)->pData[0] |= 0x00 << 1; |
Tom0108 | 0:761a63c6d020 | 113 | break; |
Tom0108 | 0:761a63c6d020 | 114 | } |
Tom0108 | 0:761a63c6d020 | 115 | |
Tom0108 | 0:761a63c6d020 | 116 | /* PIC上の出力番号を指定 */ |
Tom0108 | 0:761a63c6d020 | 117 | /* 0b00000000 or 0b00000001 */ |
Tom0108 | 0:761a63c6d020 | 118 | (MD_I2C_Data + num)->pData[0] |= (MD_I2C_Data + num)->Number; |
Tom0108 | 0:761a63c6d020 | 119 | /* PWM値が100より大きかったら範囲内に補正 */ |
Tom0108 | 0:761a63c6d020 | 120 | if (MD_GET_PWM(MD_I2C_Data, num) > 99) |
Tom0108 | 0:761a63c6d020 | 121 | MD_SET_PWM(MD_I2C_Data, num, 99); |
Tom0108 | 0:761a63c6d020 | 122 | |
Tom0108 | 0:761a63c6d020 | 123 | /* PWM(0~100)を0~127に変換して代入(オーバーフロー防止で16bitに一時変換) */ |
Tom0108 | 0:761a63c6d020 | 124 | (MD_I2C_Data + num)->pData[1] = (uint8_t)((uint16_t)MD_GET_PWM(MD_I2C_Data, num) * 127 / 100); |
Tom0108 | 0:761a63c6d020 | 125 | |
Tom0108 | 0:761a63c6d020 | 126 | /*8bitから7bitに変換*/ |
Tom0108 | 0:761a63c6d020 | 127 | i2c.write((MD_I2C_Data + num)->DevAddress << 1,(MD_I2C_Data + num)->pData,2); |
Tom0108 | 0:761a63c6d020 | 128 | } |
Tom0108 | 0:761a63c6d020 | 129 | |
Tom0108 | 0:761a63c6d020 | 130 | /** |
Tom0108 | 0:761a63c6d020 | 131 | * @brief MDに通信確認用送信 |
Tom0108 | 0:761a63c6d020 | 132 | * @param MD_I2C_Data: I2C式MDデータ構造 |
Tom0108 | 0:761a63c6d020 | 133 | * @param num: 使用MD番号 |
Tom0108 | 0:761a63c6d020 | 134 | * @retval なし |
Tom0108 | 0:761a63c6d020 | 135 | * @detail I2C式MD側が通信が切れていないことを確認するために空データを送信する |
Tom0108 | 0:761a63c6d020 | 136 | */ |
Tom0108 | 0:761a63c6d020 | 137 | void Y_I2C::MD_I2C_Empty(MD_I2C_Data_TypeDef *MD_I2C_Data, uint8_t num) |
Tom0108 | 0:761a63c6d020 | 138 | { |
Tom0108 | 0:761a63c6d020 | 139 | /* 送信データをMD更新フラグを立てず初期化 */ |
Tom0108 | 0:761a63c6d020 | 140 | (MD_I2C_Data+num)->pData[0] = 0; |
Tom0108 | 0:761a63c6d020 | 141 | |
Tom0108 | 0:761a63c6d020 | 142 | /* PIC上の出力番号を指定 */ |
Tom0108 | 0:761a63c6d020 | 143 | /* 0b00000000 or 0b00000001 */ |
Tom0108 | 0:761a63c6d020 | 144 | (MD_I2C_Data+num)->pData[0] |= (MD_I2C_Data+num)->Number; |
Tom0108 | 0:761a63c6d020 | 145 | |
Tom0108 | 0:761a63c6d020 | 146 | /*8bitから7bitに変換*/ |
Tom0108 | 0:761a63c6d020 | 147 | i2c.write((MD_I2C_Data + num)->DevAddress << 1,(MD_I2C_Data + num)->pData,2); |
Tom0108 | 0:761a63c6d020 | 148 | } |