YKNCT / YKNCT_I2C_lib

Dependents:   arim_AutoMachine

Committer:
Tom0108
Date:
Mon Apr 29 16:26:19 2019 +0000
Revision:
15:23cf4a802b5b
Parent:
11:c7c764e21224
Child:
18:c631bf8fc741
Servo added

Who changed what in which revision?

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