YKNCT / YKNCT_I2C_lib

Dependents:   arim_AutoMachine

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);
}