YKNCT / YKNCT_I2C_lib

Dependents:   arim_AutoMachine

Committer:
Tom0108
Date:
Thu Apr 04 10:16:19 2019 +0000
Revision:
5:29d8a2619c4f
Parent:
4:89a35cd1334a
Child:
6:329e7b9d8cfc
I made the return blood of i2c encoder double

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