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
- Committer:
- Tom0108
- Date:
- 2019-04-03
- Revision:
- 3:397a179b4d9e
- Parent:
- 2:f5faf991cd86
- Child:
- 4:89a35cd1334a
File content as of revision 3:397a179b4d9e:
#include "YKNCT_I2C.h" Y_I2C::Y_I2C(PinName sda, PinName scl) : i2c(sda, scl) { i2c.frequency(100000); } void Y_I2C::Out(int address, char data) { i2c.write(address<<1, &data, 1, false); wait_us(1000); } int Y_I2C::In(int address, int num) { static char data=0; i2c.read(address<<1, &data, 1, false); wait_us(1000); return data>>num&1; } int Y_I2C::Adc(int address, int num) { static char data[8]= {0}; static int ad_data[4]= {0}; i2c.read(address<<1, data, 8, false); for(int i=0; i<4; i++) ad_data[i]=(int16_t)data[i*2+1]<<8|data[i*2]; wait_us(1000); return ad_data[num]; } int Y_I2C::Enc(int address) { static char data[4]= {0}; static double enc_data=0; i2c.read(address<<1, data, 4, false); enc_data=data[3]<<24|data[2]<<16|data[1]<<8|data[0];; wait_us(1000); return enc_data; } void Y_I2C::MD_I2C(MD_I2C_Data_TypeDef *MD_I2C_Data, uint8_t number) { /* 送信データ [0] [ MD出力更新 | 0 | 0 | 0 | 0 | ブレーキ | 回転方向 | MD指定 ] [1] PWM値(7bit) */ /* 送信データをMD更新フラグを立てて初期化 */ (MD_I2C_Data + number)->pData[0] = 0x80; /* モーターの駆動状態によってデータセット */ switch (MD_GET_DRIVE(MD_I2C_Data, number)) { /* ブレーキ,ブレーキビット 1,回転方向ビット 0 */ /* 0b00000100 */ case MD_BRAKE: (MD_I2C_Data + number)->pData[0] |= 0x02 << 1; break; /* 正転,ブレーキビット 0,回転方向ビット 1 */ /* 0b00000001 */ case MD_FORWARD: (MD_I2C_Data + number)->pData[0] |= 0x01 << 1; break; /* 逆転,ブレーキビット 0,回転方向ビット 0 */ /* 0b00000000 */ case MD_REVERSE: (MD_I2C_Data + number)->pData[0] |= 0x00 << 1; break; } /* PIC上の出力番号を指定 */ /* 0b00000000 or 0b00000001 */ (MD_I2C_Data + number)->pData[0] |= (MD_I2C_Data + number)->Number; /* PWM値が100より大きかったら範囲内に補正 */ if (MD_GET_PWM(MD_I2C_Data, number) > 99) MD_SET_PWM(MD_I2C_Data, number, 99); /* PWM(0~100)を0~127に変換して代入(オーバーフロー防止で16bitに一時変換) */ (MD_I2C_Data + number)->pData[1] = (uint8_t)((uint16_t)MD_GET_PWM(MD_I2C_Data, number) * 127 / 100); /*8bitから7bitに変換*/ i2c.write((MD_I2C_Data + number)->DevAddress << 1,(MD_I2C_Data + number)->pData,2); } /** * @brief MDに通信確認用送信 * @param MD_I2C_Data: I2C式MDデータ構造 * @param number: 使用MD番号 * @retval なし * @detail I2C式MD側が通信が切れていないことを確認するために空データを送信する */ void Y_I2C::MD_I2C_Empty(MD_I2C_Data_TypeDef *MD_I2C_Data, uint8_t number) { /* 送信データをMD更新フラグを立てず初期化 */ (MD_I2C_Data+number)->pData[0] = 0; /* PIC上の出力番号を指定 */ /* 0b00000000 or 0b00000001 */ (MD_I2C_Data+number)->pData[0] |= (MD_I2C_Data+number)->Number; /*8bitから7bitに変換*/ i2c.write((MD_I2C_Data + number)->DevAddress << 1,(MD_I2C_Data + number)->pData,2); }