YKNCT / YKNCT_I2C_lib

Dependents:   arim_AutoMachine

Committer:
Tom0108
Date:
Wed Apr 17 10:32:03 2019 +0000
Revision:
10:49ffdd5cf82e
Parent:
9:f892d57a6714
Child:
11:c7c764e21224
updata i2c

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 7:5b22492a5a13 8 void Y_I2C::Out_Set(OUT_I2C_Data_TypeDef *OUT_I2C_Data, uint8_t num, uint8_t value, uint8_t shift)
Tom0108 7:5b22492a5a13 9 {
Tom0108 7:5b22492a5a13 10 if(value==1)
Tom0108 7:5b22492a5a13 11 (OUT_I2C_Data+num) -> out_data |= 1<<shift;
Tom0108 7:5b22492a5a13 12 else
Tom0108 7:5b22492a5a13 13 (OUT_I2C_Data+num) -> out_data &= ~(1<<shift);
Tom0108 7:5b22492a5a13 14 }
Tom0108 7:5b22492a5a13 15
Tom0108 7:5b22492a5a13 16 void Y_I2C::Out(OUT_I2C_Data_TypeDef *OUT_I2C_Data, uint8_t num)
Tom0108 7:5b22492a5a13 17 {
Tom0108 9:f892d57a6714 18 i2c.write((OUT_I2C_Data+num) -> DevAddress<<1, &(OUT_I2C_Data+num)->out_data, 1);
Tom0108 9:f892d57a6714 19 wait_us(1000);
Tom0108 8:f7779710d64a 20 }
Tom0108 8:f7779710d64a 21
Tom0108 8:f7779710d64a 22 void Y_I2C::In(IN_I2C_Data_TypeDef *IN_I2C_Data, uint8_t num)
Tom0108 8:f7779710d64a 23 {
Tom0108 9:f892d57a6714 24 static char data;
Tom0108 10:49ffdd5cf82e 25 uint8_t array=(IN_I2C_Data+num)->Number;
Tom0108 9:f892d57a6714 26
Tom0108 9:f892d57a6714 27 i2c.read((IN_I2C_Data+num) -> DevAddress<<1, &data, 1);
Tom0108 9:f892d57a6714 28
Tom0108 10:49ffdd5cf82e 29 (IN_I2C_Data+num)->in_data=data&1<<array;
Tom0108 3:397a179b4d9e 30 wait_us(1000);
Tom0108 1:67d5ea2ff6c1 31 }
Tom0108 1:67d5ea2ff6c1 32
Tom0108 8:f7779710d64a 33 void Y_I2C::Adc(ADC_I2C_Data_TypeDef *ADC_I2C_Data, uint8_t num)
Tom0108 0:c555f844eb8d 34 {
Tom0108 0:c555f844eb8d 35 static char data[8]= {0};
Tom0108 10:49ffdd5cf82e 36 uint8_t array=(ADC_I2C_Data+num)->Number;
Tom0108 0:c555f844eb8d 37
Tom0108 9:f892d57a6714 38 i2c.read((ADC_I2C_Data+num) -> DevAddress<<1, data, 8);
Tom0108 9:f892d57a6714 39
Tom0108 10:49ffdd5cf82e 40 (ADC_I2C_Data+num)->adc_data=data[array*2+1]<<8|data[array*2];
Tom0108 2:f5faf991cd86 41 wait_us(1000);
Tom0108 0:c555f844eb8d 42 }
Tom0108 0:c555f844eb8d 43
Tom0108 9:f892d57a6714 44 void Y_I2C::Enc(ENC_I2C_Data_TypeDef *ENC_I2C_Data, uint8_t num)
Tom0108 3:397a179b4d9e 45 {
Tom0108 3:397a179b4d9e 46 static char data[4]= {0};
Tom0108 3:397a179b4d9e 47
Tom0108 9:f892d57a6714 48 i2c.read((ENC_I2C_Data+num) -> DevAddress<<1, data, 4);
Tom0108 3:397a179b4d9e 49
Tom0108 9:f892d57a6714 50 (ENC_I2C_Data+num)->enc_data=data[3]<<24|data[2]<<16|data[1]<<8|data[0];
Tom0108 3:397a179b4d9e 51 wait_us(1000);
Tom0108 3:397a179b4d9e 52 }
Tom0108 3:397a179b4d9e 53
Tom0108 9:f892d57a6714 54 void Y_I2C::MD_I2C(MD_I2C_Data_TypeDef *MD_I2C_Data, uint8_t num)
Tom0108 2:f5faf991cd86 55 {
Tom0108 2:f5faf991cd86 56 /* 送信データ
Tom0108 2:f5faf991cd86 57 [0] [ MD出力更新 | 0 | 0 | 0 | 0 | ブレーキ | 回転方向 | MD指定 ]
Tom0108 2:f5faf991cd86 58 [1] PWM値(7bit)
Tom0108 2:f5faf991cd86 59 */
Tom0108 0:c555f844eb8d 60
Tom0108 2:f5faf991cd86 61 /* 送信データをMD更新フラグを立てて初期化 */
Tom0108 9:f892d57a6714 62 (MD_I2C_Data + num)->pData[0] = 0x80;
Tom0108 2:f5faf991cd86 63 /* モーターの駆動状態によってデータセット */
Tom0108 9:f892d57a6714 64 switch (MD_GET_DRIVE(MD_I2C_Data, num)) {
Tom0108 2:f5faf991cd86 65 /* ブレーキ,ブレーキビット 1,回転方向ビット 0 */
Tom0108 2:f5faf991cd86 66 /* 0b00000100 */
Tom0108 2:f5faf991cd86 67 case MD_BRAKE:
Tom0108 9:f892d57a6714 68 (MD_I2C_Data + num)->pData[0] |= 0x02 << 1;
Tom0108 2:f5faf991cd86 69 break;
Tom0108 2:f5faf991cd86 70 /* 正転,ブレーキビット 0,回転方向ビット 1 */
Tom0108 2:f5faf991cd86 71 /* 0b00000001 */
Tom0108 2:f5faf991cd86 72 case MD_FORWARD:
Tom0108 9:f892d57a6714 73 (MD_I2C_Data + num)->pData[0] |= 0x01 << 1;
Tom0108 2:f5faf991cd86 74 break;
Tom0108 2:f5faf991cd86 75 /* 逆転,ブレーキビット 0,回転方向ビット 0 */
Tom0108 2:f5faf991cd86 76 /* 0b00000000 */
Tom0108 2:f5faf991cd86 77 case MD_REVERSE:
Tom0108 9:f892d57a6714 78 (MD_I2C_Data + num)->pData[0] |= 0x00 << 1;
Tom0108 2:f5faf991cd86 79 break;
Tom0108 2:f5faf991cd86 80 }
Tom0108 0:c555f844eb8d 81
Tom0108 2:f5faf991cd86 82 /* PIC上の出力番号を指定 */
Tom0108 2:f5faf991cd86 83 /* 0b00000000 or 0b00000001 */
Tom0108 9:f892d57a6714 84 (MD_I2C_Data + num)->pData[0] |= (MD_I2C_Data + num)->Number;
Tom0108 2:f5faf991cd86 85 /* PWM値が100より大きかったら範囲内に補正 */
Tom0108 9:f892d57a6714 86 if (MD_GET_PWM(MD_I2C_Data, num) > 99)
Tom0108 9:f892d57a6714 87 MD_SET_PWM(MD_I2C_Data, num, 99);
Tom0108 1:67d5ea2ff6c1 88
Tom0108 2:f5faf991cd86 89 /* PWM(0~100)を0~127に変換して代入(オーバーフロー防止で16bitに一時変換) */
Tom0108 9:f892d57a6714 90 (MD_I2C_Data + num)->pData[1] = (uint8_t)((uint16_t)MD_GET_PWM(MD_I2C_Data, num) * 127 / 100);
Tom0108 2:f5faf991cd86 91
Tom0108 2:f5faf991cd86 92 /*8bitから7bitに変換*/
Tom0108 9:f892d57a6714 93 i2c.write((MD_I2C_Data + num)->DevAddress << 1,(MD_I2C_Data + num)->pData,2);
Tom0108 4:89a35cd1334a 94 wait_us(1000);
Tom0108 2:f5faf991cd86 95 }
Tom0108 1:67d5ea2ff6c1 96
Tom0108 2:f5faf991cd86 97 /**
Tom0108 2:f5faf991cd86 98 * @brief MDに通信確認用送信
Tom0108 2:f5faf991cd86 99 * @param MD_I2C_Data: I2C式MDデータ構造
Tom0108 9:f892d57a6714 100 * @param num: 使用MD番号
Tom0108 2:f5faf991cd86 101 * @retval なし
Tom0108 2:f5faf991cd86 102 * @detail I2C式MD側が通信が切れていないことを確認するために空データを送信する
Tom0108 2:f5faf991cd86 103 */
Tom0108 9:f892d57a6714 104 void Y_I2C::MD_I2C_Empty(MD_I2C_Data_TypeDef *MD_I2C_Data, uint8_t num)
Tom0108 2:f5faf991cd86 105 {
Tom0108 2:f5faf991cd86 106 /* 送信データをMD更新フラグを立てず初期化 */
Tom0108 9:f892d57a6714 107 (MD_I2C_Data+num)->pData[0] = 0;
Tom0108 1:67d5ea2ff6c1 108
Tom0108 2:f5faf991cd86 109 /* PIC上の出力番号を指定 */
Tom0108 2:f5faf991cd86 110 /* 0b00000000 or 0b00000001 */
Tom0108 9:f892d57a6714 111 (MD_I2C_Data+num)->pData[0] |= (MD_I2C_Data+num)->Number;
Tom0108 2:f5faf991cd86 112
Tom0108 2:f5faf991cd86 113 /*8bitから7bitに変換*/
Tom0108 9:f892d57a6714 114 i2c.write((MD_I2C_Data + num)->DevAddress << 1,(MD_I2C_Data + num)->pData,2);
Tom0108 4:89a35cd1334a 115 wait_us(1000);
Tom0108 2:f5faf991cd86 116 }