c2a-core 4.5.1

Core of Command Centric Architecture
Documentation
/**
 * @file
 * @brief I2C通信(Master側)のHALです。
 * @note I2C HALは、
 *       I2Cポートの初期化、データ送信、データ受信を行う、
 *       I2C通信の抽象化レイヤです。
 *       個々の機器でこのインターフェースを実装して使用します。
 */

#ifndef I2C_H_
#define I2C_H_

#include <stdint.h>

 /**
  * @struct I2cConfig
  * @brief I2Cポートの初期化、データ送信・受信の際に必要となる設定情報を格納する構造体です。
  */
typedef struct
{
  uint8_t  ch;                 //!< 継承先の機器がつながっているポート番号
  uint32_t frequency_khz;      //!< I2Cクロックの周波数 単位:kHz
  uint8_t  device_address;     //!< 継承先の機器のアドレス
  uint8_t  stop_flag;          //!< 最後にSTOPを送るか否かを選択 0->送らない,それ以外->送る
  uint32_t timeout_threshold;  //!< この値を超えるとタイムアウトエラーとなる 単位:カウント数(ユーザー依存) TODO: 時刻にするか要検討
  uint32_t rx_length;          //!< I2C通信における受信データ長 単位: Byte
} I2C_Config;

/**
 * @enum  I2C_ERR_CODE
 * @brief I2C用の汎用エラーコード
 * @note  型はint8_tを想定しているが, if_listでラップされているためI2Cの公開関数の返り値はintとなっている
 *        基本負なのはRXの返り値は正が送ったByte数, 負がエラーコードとなっているため
 */
typedef enum
{
  I2C_UNKNOWN_ERR     = -20,  //!< 原因不明
  I2C_RX_BUFFER_SMALL = -14,  //!< 受信バッファサイズが受信データ長より小さい
  I2C_DATA_NEGA_ERR   = -13,  //!< 送受信データサイズが負のエラー
  I2C_TIMEOUT         = -10,  //!< 通信時のTimeout
  I2C_YET_ERR         = -4,   //!< チャンネル未オープン
  I2C_ALREADY_ERR     = -3,   //!< チャンネルオープン済み
  I2C_FREQUENCY_ERR   = -2,   //!< 周波数異常
  I2C_CH_ERR          = -1,   //!< チャンネル異常 (Port_configに無い)
  I2C_OK              = 0     //!< OKは0を踏襲
} I2C_ERR_CODE;

/**
 * @brief I2cConfig構造体をグローバルインスタンスとして定義し、ポインタを渡すことでポートを初期化します。
 * @param[in] my_i2c_v 初期化するI2cConfig構造体へのポインタ
 * @return int I2C_ERR_CODEとしたいが, if_listでintと統一されている。
 * @note I2C通信ラッパーのクラスを使用する時は起動時に必ず実施してください。
 *       この関数を実行する前にI2cConfig構造体内の設定値を設定しておく必要があります。
 */
int I2C_init(void* my_i2c_v);

/**
 * @brief I2cConfig構造体にて指定されたchからデータを受信します
 * @param[in]  my_i2c_v    : 対象とするI2cConfig構造体へのポインタ
 * @param[out] data_v      : 受信データ格納先へのポインタ
 * @param[in]  buffer_size : 受信データ格納先のバッファサイズ、I2C通信による受信データ長よりも長い必要がある
 * @retval 0: 受信データなし
 * @retval 正: 受信データバイト数
 * @retval 負: エラー. I2C_ERR_CODE に従う
 * @note この関数内でI2C読み出し要求を送信しています
 */
int I2C_rx(void* my_i2c_v, void* data_v, int buffer_size);

/**
 * @brief I2cConfig構造体にて指定されたchへデータを送信します
 * @param[in] my_i2c_v : 対象とするI2cConfig構造体へのポインタ
 * @param[in] data_v     : 送信データ格納先へのポインタ
 * @param[in] count      : 送信データサイズ
 * @return int:  I2C_ERR_CODE に従う
 */
int I2C_tx(void* my_i2c_v, void* data_v, int data_size);

/**
 * @brief 指定されたchを開きなおす
 * @param[in] my_i2c_v 開きなおす際のポート設定
 * @param[in] reason   reopenする理由.0は正常操作を示す TODO: reasonのenumを作る?
 * @return int:  I2C_ERR_CODE に従う
 */
int I2C_reopen(void* my_i2c_v, int reason);

/**
 * @brief stop_flagを設定する
 * @param[in] stop_flag 設定するstop_flag
 * @return なし
 */
void I2C_set_stop_flag(void* my_i2c_v, const uint8_t stop_flag);

/**
 * @brief rx_lengthを設定する
 * @param[in] rx_length  設定する受信データ長
 * @return なし
 */
void I2C_set_rx_length(void* my_i2c_v, const uint32_t rx_length);

#endif