Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
YKNCT_I2C.cpp@7:5b22492a5a13, 2019-04-15 (annotated)
- Committer:
- Tom0108
- Date:
- Mon Apr 15 10:42:16 2019 +0000
- Revision:
- 7:5b22492a5a13
- Parent:
- 6:329e7b9d8cfc
- Child:
- 8:f7779710d64a
Update of Out
Who changed what in which revision?
User | Revision | Line number | New 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 | 7:5b22492a5a13 | 18 | i2c.write((OUT_I2C_Data+num) -> DevAddress<<1, &(OUT_I2C_Data+num)->out_data,1); |
Tom0108 | 3:397a179b4d9e | 19 | wait_us(1000); |
Tom0108 | 7:5b22492a5a13 | 20 | |
Tom0108 | 1:67d5ea2ff6c1 | 21 | } |
Tom0108 | 1:67d5ea2ff6c1 | 22 | |
Tom0108 | 1:67d5ea2ff6c1 | 23 | int Y_I2C::In(int address, int num) |
Tom0108 | 1:67d5ea2ff6c1 | 24 | { |
Tom0108 | 1:67d5ea2ff6c1 | 25 | static char data=0; |
Tom0108 | 1:67d5ea2ff6c1 | 26 | |
Tom0108 | 1:67d5ea2ff6c1 | 27 | i2c.read(address<<1, &data, 1, false); |
Tom0108 | 1:67d5ea2ff6c1 | 28 | |
Tom0108 | 3:397a179b4d9e | 29 | wait_us(1000); |
Tom0108 | 1:67d5ea2ff6c1 | 30 | return data>>num&1; |
Tom0108 | 1:67d5ea2ff6c1 | 31 | } |
Tom0108 | 1:67d5ea2ff6c1 | 32 | |
Tom0108 | 0:c555f844eb8d | 33 | int Y_I2C::Adc(int address, int num) |
Tom0108 | 0:c555f844eb8d | 34 | { |
Tom0108 | 0:c555f844eb8d | 35 | static char data[8]= {0}; |
Tom0108 | 0:c555f844eb8d | 36 | static int ad_data[4]= {0}; |
Tom0108 | 0:c555f844eb8d | 37 | |
Tom0108 | 0:c555f844eb8d | 38 | i2c.read(address<<1, data, 8, false); |
Tom0108 | 0:c555f844eb8d | 39 | |
Tom0108 | 0:c555f844eb8d | 40 | for(int i=0; i<4; i++) |
Tom0108 | 0:c555f844eb8d | 41 | ad_data[i]=(int16_t)data[i*2+1]<<8|data[i*2]; |
Tom0108 | 0:c555f844eb8d | 42 | |
Tom0108 | 2:f5faf991cd86 | 43 | wait_us(1000); |
Tom0108 | 0:c555f844eb8d | 44 | return ad_data[num]; |
Tom0108 | 0:c555f844eb8d | 45 | } |
Tom0108 | 0:c555f844eb8d | 46 | |
Tom0108 | 5:29d8a2619c4f | 47 | double Y_I2C::Enc(int address) |
Tom0108 | 3:397a179b4d9e | 48 | { |
Tom0108 | 3:397a179b4d9e | 49 | static char data[4]= {0}; |
Tom0108 | 6:329e7b9d8cfc | 50 | long long enc_data=0; |
Tom0108 | 3:397a179b4d9e | 51 | |
Tom0108 | 3:397a179b4d9e | 52 | i2c.read(address<<1, data, 4, false); |
Tom0108 | 3:397a179b4d9e | 53 | |
Tom0108 | 6:329e7b9d8cfc | 54 | enc_data=data[3]<<24|data[2]<<16|data[1]<<8|data[0]; |
Tom0108 | 3:397a179b4d9e | 55 | |
Tom0108 | 3:397a179b4d9e | 56 | wait_us(1000); |
Tom0108 | 3:397a179b4d9e | 57 | return enc_data; |
Tom0108 | 3:397a179b4d9e | 58 | } |
Tom0108 | 3:397a179b4d9e | 59 | |
Tom0108 | 2:f5faf991cd86 | 60 | void Y_I2C::MD_I2C(MD_I2C_Data_TypeDef *MD_I2C_Data, uint8_t number) |
Tom0108 | 2:f5faf991cd86 | 61 | { |
Tom0108 | 2:f5faf991cd86 | 62 | /* 送信データ |
Tom0108 | 2:f5faf991cd86 | 63 | [0] [ MD出力更新 | 0 | 0 | 0 | 0 | ブレーキ | 回転方向 | MD指定 ] |
Tom0108 | 2:f5faf991cd86 | 64 | [1] PWM値(7bit) |
Tom0108 | 2:f5faf991cd86 | 65 | */ |
Tom0108 | 0:c555f844eb8d | 66 | |
Tom0108 | 2:f5faf991cd86 | 67 | /* 送信データをMD更新フラグを立てて初期化 */ |
Tom0108 | 2:f5faf991cd86 | 68 | (MD_I2C_Data + number)->pData[0] = 0x80; |
Tom0108 | 2:f5faf991cd86 | 69 | /* モーターの駆動状態によってデータセット */ |
Tom0108 | 2:f5faf991cd86 | 70 | switch (MD_GET_DRIVE(MD_I2C_Data, number)) { |
Tom0108 | 2:f5faf991cd86 | 71 | /* ブレーキ,ブレーキビット 1,回転方向ビット 0 */ |
Tom0108 | 2:f5faf991cd86 | 72 | /* 0b00000100 */ |
Tom0108 | 2:f5faf991cd86 | 73 | case MD_BRAKE: |
Tom0108 | 2:f5faf991cd86 | 74 | (MD_I2C_Data + number)->pData[0] |= 0x02 << 1; |
Tom0108 | 2:f5faf991cd86 | 75 | break; |
Tom0108 | 2:f5faf991cd86 | 76 | /* 正転,ブレーキビット 0,回転方向ビット 1 */ |
Tom0108 | 2:f5faf991cd86 | 77 | /* 0b00000001 */ |
Tom0108 | 2:f5faf991cd86 | 78 | case MD_FORWARD: |
Tom0108 | 2:f5faf991cd86 | 79 | (MD_I2C_Data + number)->pData[0] |= 0x01 << 1; |
Tom0108 | 2:f5faf991cd86 | 80 | break; |
Tom0108 | 2:f5faf991cd86 | 81 | /* 逆転,ブレーキビット 0,回転方向ビット 0 */ |
Tom0108 | 2:f5faf991cd86 | 82 | /* 0b00000000 */ |
Tom0108 | 2:f5faf991cd86 | 83 | case MD_REVERSE: |
Tom0108 | 2:f5faf991cd86 | 84 | (MD_I2C_Data + number)->pData[0] |= 0x00 << 1; |
Tom0108 | 2:f5faf991cd86 | 85 | break; |
Tom0108 | 2:f5faf991cd86 | 86 | } |
Tom0108 | 0:c555f844eb8d | 87 | |
Tom0108 | 2:f5faf991cd86 | 88 | /* PIC上の出力番号を指定 */ |
Tom0108 | 2:f5faf991cd86 | 89 | /* 0b00000000 or 0b00000001 */ |
Tom0108 | 2:f5faf991cd86 | 90 | (MD_I2C_Data + number)->pData[0] |= (MD_I2C_Data + number)->Number; |
Tom0108 | 2:f5faf991cd86 | 91 | /* PWM値が100より大きかったら範囲内に補正 */ |
Tom0108 | 2:f5faf991cd86 | 92 | if (MD_GET_PWM(MD_I2C_Data, number) > 99) |
Tom0108 | 2:f5faf991cd86 | 93 | MD_SET_PWM(MD_I2C_Data, number, 99); |
Tom0108 | 1:67d5ea2ff6c1 | 94 | |
Tom0108 | 2:f5faf991cd86 | 95 | /* PWM(0~100)を0~127に変換して代入(オーバーフロー防止で16bitに一時変換) */ |
Tom0108 | 2:f5faf991cd86 | 96 | (MD_I2C_Data + number)->pData[1] = (uint8_t)((uint16_t)MD_GET_PWM(MD_I2C_Data, number) * 127 / 100); |
Tom0108 | 2:f5faf991cd86 | 97 | |
Tom0108 | 2:f5faf991cd86 | 98 | /*8bitから7bitに変換*/ |
Tom0108 | 2:f5faf991cd86 | 99 | i2c.write((MD_I2C_Data + number)->DevAddress << 1,(MD_I2C_Data + number)->pData,2); |
Tom0108 | 4:89a35cd1334a | 100 | wait_us(1000); |
Tom0108 | 2:f5faf991cd86 | 101 | } |
Tom0108 | 1:67d5ea2ff6c1 | 102 | |
Tom0108 | 2:f5faf991cd86 | 103 | /** |
Tom0108 | 2:f5faf991cd86 | 104 | * @brief MDに通信確認用送信 |
Tom0108 | 2:f5faf991cd86 | 105 | * @param MD_I2C_Data: I2C式MDデータ構造 |
Tom0108 | 2:f5faf991cd86 | 106 | * @param number: 使用MD番号 |
Tom0108 | 2:f5faf991cd86 | 107 | * @retval なし |
Tom0108 | 2:f5faf991cd86 | 108 | * @detail I2C式MD側が通信が切れていないことを確認するために空データを送信する |
Tom0108 | 2:f5faf991cd86 | 109 | */ |
Tom0108 | 2:f5faf991cd86 | 110 | void Y_I2C::MD_I2C_Empty(MD_I2C_Data_TypeDef *MD_I2C_Data, uint8_t number) |
Tom0108 | 2:f5faf991cd86 | 111 | { |
Tom0108 | 2:f5faf991cd86 | 112 | /* 送信データをMD更新フラグを立てず初期化 */ |
Tom0108 | 2:f5faf991cd86 | 113 | (MD_I2C_Data+number)->pData[0] = 0; |
Tom0108 | 1:67d5ea2ff6c1 | 114 | |
Tom0108 | 2:f5faf991cd86 | 115 | /* PIC上の出力番号を指定 */ |
Tom0108 | 2:f5faf991cd86 | 116 | /* 0b00000000 or 0b00000001 */ |
Tom0108 | 2:f5faf991cd86 | 117 | (MD_I2C_Data+number)->pData[0] |= (MD_I2C_Data+number)->Number; |
Tom0108 | 2:f5faf991cd86 | 118 | |
Tom0108 | 2:f5faf991cd86 | 119 | /*8bitから7bitに変換*/ |
Tom0108 | 2:f5faf991cd86 | 120 | i2c.write((MD_I2C_Data + number)->DevAddress << 1,(MD_I2C_Data + number)->pData,2); |
Tom0108 | 4:89a35cd1334a | 121 | wait_us(1000); |
Tom0108 | 2:f5faf991cd86 | 122 | } |