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
00001 #include "YKNCT_I2C.h" 00002 00003 Y_I2C::Y_I2C(PinName sda, PinName scl) : i2c(sda, scl) 00004 { 00005 00006 i2c.frequency(100000); 00007 } 00008 00009 void Y_I2C::Out_Set(OUT_I2C_Data_TypeDef *OUT_I2C_Data, uint8_t num, uint8_t value) 00010 { 00011 (OUT_I2C_Data+num) -> out_data =value; 00012 } 00013 00014 void Y_I2C::Out(OUT_I2C_Data_TypeDef *OUT_I2C_Data, uint8_t MAX) 00015 { 00016 int cnt=0; //何個出力したかを保存する 00017 int ad_cnt=0; //同じアドレスの数を保存する 00018 while(cnt<MAX) { 00019 char data=0; 00020 int tmp_address=(OUT_I2C_Data+cnt)->DevAddress; 00021 00022 //同じアドレスの数を数える 00023 for(ad_cnt=0;; ad_cnt++) { 00024 if(tmp_address!=(OUT_I2C_Data+cnt+ad_cnt)->DevAddress) 00025 break; 00026 } 00027 //一枚の基板に出力するデータを格納する 00028 for(int j=0; j<ad_cnt; j++) data|=(OUT_I2C_Data+cnt+j)->out_data<<j; 00029 00030 i2c.write(((OUT_I2C_Data+cnt)->DevAddress)<<1, &data, 1); 00031 cnt+=ad_cnt; 00032 } 00033 } 00034 00035 void Y_I2C::Servo_Set(SERVO_I2C_Data_TypeDef *SERVO_I2C_Data, uint8_t num, uint16_t pulse) 00036 { 00037 (SERVO_I2C_Data+num)->pulse=pulse; 00038 } 00039 00040 //4biteづつ送信する 00041 void Y_I2C::Servo(SERVO_I2C_Data_TypeDef *SERVO_I2C_Data, uint8_t MAX) 00042 { 00043 for(int i=0; i<(MAX+1)/2; i++) { 00044 char data[4]= {0}; 00045 00046 //MAXが奇数で最後の時 00047 if(i==MAX/2 && MAX%2==1) { 00048 for(int j=0; j<2; j++) 00049 //16bitのpulse1つを8bitづつに分けてdataに保存する 00050 data[j]=(SERVO_I2C_Data+i*2+j/2)->pulse>>(1-j%2)*8; 00051 } else { 00052 for(int j=0; j<4; j++) 00053 //16bitのpulse2つを8bitづつに分けてdataに保存する 00054 data[j]=(SERVO_I2C_Data+i*2+j/2)->pulse>>(1-j%2)*8; 00055 } 00056 i2c.write(((SERVO_I2C_Data+i)->DevAddress+93)<<1, data, 4); 00057 } 00058 } 00059 00060 void Y_I2C::In(IN_I2C_Data_TypeDef *IN_I2C_Data, uint8_t num) 00061 { 00062 char data; 00063 uint8_t array=(IN_I2C_Data+num)->Number; 00064 00065 i2c.read(((IN_I2C_Data+num)->DevAddress+25)<<1, &data, 1); 00066 00067 (IN_I2C_Data+num)->in_data=data&1<<array; 00068 } 00069 00070 void Y_I2C::Adc(ADC_I2C_Data_TypeDef *ADC_I2C_Data, uint8_t num) 00071 { 00072 char data[8]= {0}; 00073 uint8_t array=(ADC_I2C_Data+num)->Number; 00074 // adc 42 line 110 00075 i2c.read((((ADC_I2C_Data+num) -> DevAddress)+42)<<1, data, 8); 00076 00077 (ADC_I2C_Data+num)->adc_data=data[array*2+1]<<8|data[array*2]; 00078 } 00079 00080 void Y_I2C::Enc(ENC_I2C_Data_TypeDef *ENC_I2C_Data, uint8_t num) 00081 { 00082 char data[4]= {0}; 00083 00084 i2c.read(((ENC_I2C_Data+num) -> DevAddress+76)<<1, data, 4); 00085 00086 (ENC_I2C_Data+num)->enc_data=data[3]<<24|data[2]<<16|data[1]<<8|data[0]; 00087 } 00088 00089 void Y_I2C::MD_I2C(MD_I2C_Data_TypeDef *MD_I2C_Data, uint8_t num) 00090 { 00091 /* 送信データ 00092 [0] [ MD出力更新 | 0 | 0 | 0 | 0 | ブレーキ | 回転方向 | MD指定 ] 00093 [1] PWM値(7bit) 00094 */ 00095 00096 /* 送信データをMD更新フラグを立てて初期化 */ 00097 (MD_I2C_Data + num)->pData[0] = 0x80; 00098 /* モーターの駆動状態によってデータセット */ 00099 switch (MD_GET_DRIVE(MD_I2C_Data, num)) { 00100 /* ブレーキ,ブレーキビット 1,回転方向ビット 0 */ 00101 /* 0b00000100 */ 00102 case MD_BRAKE: 00103 (MD_I2C_Data + num)->pData[0] |= 0x02 << 1; 00104 break; 00105 /* 正転,ブレーキビット 0,回転方向ビット 1 */ 00106 /* 0b00000001 */ 00107 case MD_FORWARD: 00108 (MD_I2C_Data + num)->pData[0] |= 0x01 << 1; 00109 break; 00110 /* 逆転,ブレーキビット 0,回転方向ビット 0 */ 00111 /* 0b00000000 */ 00112 case MD_REVERSE: 00113 (MD_I2C_Data + num)->pData[0] |= 0x00 << 1; 00114 break; 00115 } 00116 00117 /* PIC上の出力番号を指定 */ 00118 /* 0b00000000 or 0b00000001 */ 00119 (MD_I2C_Data + num)->pData[0] |= (MD_I2C_Data + num)->Number; 00120 /* PWM値が100より大きかったら範囲内に補正 */ 00121 if (MD_GET_PWM(MD_I2C_Data, num) > 99) 00122 MD_SET_PWM(MD_I2C_Data, num, 99); 00123 00124 /* PWM(0~100)を0~127に変換して代入(オーバーフロー防止で16bitに一時変換) */ 00125 (MD_I2C_Data + num)->pData[1] = (uint8_t)((uint16_t)MD_GET_PWM(MD_I2C_Data, num) * 127 / 100); 00126 00127 /*8bitから7bitに変換*/ 00128 i2c.write((MD_I2C_Data + num)->DevAddress << 1,(MD_I2C_Data + num)->pData,2); 00129 } 00130 00131 /** 00132 * @brief MDに通信確認用送信 00133 * @param MD_I2C_Data: I2C式MDデータ構造 00134 * @param num: 使用MD番号 00135 * @retval なし 00136 * @detail I2C式MD側が通信が切れていないことを確認するために空データを送信する 00137 */ 00138 void Y_I2C::MD_I2C_Empty(MD_I2C_Data_TypeDef *MD_I2C_Data, uint8_t num) 00139 { 00140 /* 送信データをMD更新フラグを立てず初期化 */ 00141 (MD_I2C_Data+num)->pData[0] = 0; 00142 00143 /* PIC上の出力番号を指定 */ 00144 /* 0b00000000 or 0b00000001 */ 00145 (MD_I2C_Data+num)->pData[0] |= (MD_I2C_Data+num)->Number; 00146 00147 /*8bitから7bitに変換*/ 00148 i2c.write((MD_I2C_Data + num)->DevAddress << 1,(MD_I2C_Data + num)->pData,2); 00149 }
Generated on Mon Jul 25 2022 18:34:01 by
1.7.2