C2A_Core
i2c_common.c
[詳解]
1 #pragma section REPRO
8 #include "i2c_common.h"
9 #include "../../Library/endian.h"
10 #include <string.h>
11 
22 static DS_ERR_CODE I2C_write_bytes_(DriverSuper* p_super, uint8_t stream, I2C_Config* p_i2c_config,
23  uint8_t register_address, void* data_v, uint8_t data_len);
24 
35 static DS_ERR_CODE I2C_read_bytes_(DriverSuper* p_super, uint8_t stream, I2C_Config* p_i2c_config,
36  uint8_t register_address, void* data_v, uint8_t buffer_size);
37 
38 DS_ERR_CODE I2C_write_byte(DriverSuper* p_super, uint8_t stream, I2C_Config* p_i2c_config, uint8_t register_address, uint8_t data)
39 {
40  return I2C_write_bytes_(p_super, stream, p_i2c_config, register_address, &data, sizeof(data));
41 }
42 
43 DS_ERR_CODE I2C_write_2bytes(DriverSuper* p_super, uint8_t stream, I2C_Config* p_i2c_config, uint8_t register_address, uint16_t data)
44 {
45  return I2C_write_bytes_(p_super, stream, p_i2c_config, register_address, &data, sizeof(data));
46 }
47 
48 static DS_ERR_CODE I2C_write_bytes_(DriverSuper* p_super, uint8_t stream, I2C_Config* p_i2c_config,
49  uint8_t register_address, void* data_v, uint8_t data_len)
50 {
51  uint8_t tx_data[sizeof(register_address) + sizeof(uint16_t)];
52  DS_StreamConfig* stream_config = &(p_super->stream_config[stream]);
53 
54  tx_data[0] = register_address;
55  ENDIAN_memcpy(tx_data + sizeof(register_address), data_v, data_len);
56  I2C_set_stop_flag(p_i2c_config, 1);
57  DSSC_set_tx_frame(stream_config, tx_data);
58  DSSC_set_tx_frame_size(stream_config, sizeof(register_address) + data_len);
59 
60  return DS_send_general_cmd(p_super, stream);
61 }
62 
63 DS_ERR_CODE I2C_read_byte(DriverSuper* p_super, uint8_t stream, I2C_Config* p_i2c_config,
64  uint8_t register_address, uint8_t* data)
65 {
66  return I2C_read_bytes_(p_super, stream, p_i2c_config, register_address, data, sizeof(*data));
67 }
68 
69 DS_ERR_CODE I2C_read_2bytes(DriverSuper* p_super, uint8_t stream, I2C_Config* p_i2c_config,
70  uint8_t register_address, uint16_t* data)
71 {
72  return I2C_read_bytes_(p_super, stream, p_i2c_config, register_address, data, sizeof(*data));
73 }
74 
75 static DS_ERR_CODE I2C_read_bytes_(DriverSuper* p_super, uint8_t stream, I2C_Config* p_i2c_config,
76  uint8_t register_address, void* data_v, uint8_t buffer_size)
77 {
79  const uint8_t* rx_data;
80  DS_StreamConfig* stream_config = &(p_super->stream_config[stream]);
81 
82  // read setting
83  DSSC_set_rx_frame_size(stream_config, buffer_size);
84  I2C_set_rx_length(p_i2c_config, buffer_size);
85  DS_clear_rx_buffer(p_super);
86  // send
87  I2C_set_stop_flag(p_i2c_config, 0);
88  DSSC_set_tx_frame(stream_config, &register_address);
89  DSSC_set_tx_frame_size(stream_config, sizeof(register_address));
90  ret = DS_send_req_tlm_cmd(p_super, stream);
91  if (ret != DS_ERR_CODE_OK) return ret;
92  // read
93  I2C_set_stop_flag(p_i2c_config, 1);
94  ret = DS_receive(p_super);
95  if (ret != DS_ERR_CODE_OK) return ret;
96  if (DSSC_get_rec_status(stream_config)->status_code != DS_STREAM_REC_STATUS_FIXED_FRAME)
97  {
98  return DS_ERR_CODE_ERR;
99  }
100 
101  rx_data = DSSC_get_rx_frame(stream_config);
102  ENDIAN_memcpy(data_v, rx_data, buffer_size);
103 
104  return ret;
105 }
106 
107 #pragma section
void DSSC_set_rx_frame_size(DS_StreamConfig *p_stream_config, const int16_t rx_frame_size)
void DSSC_set_tx_frame(DS_StreamConfig *p_stream_config, uint8_t *tx_frame)
const DS_StreamRecStatus * DSSC_get_rec_status(const DS_StreamConfig *p_stream_config)
void DSSC_set_tx_frame_size(DS_StreamConfig *p_stream_config, const uint16_t tx_frame_size)
DS_ERR_CODE DS_receive(DriverSuper *p_super)
継承先の機器からテレメトリを受信する
Definition: driver_super.c:355
DS_ERR_CODE DS_clear_rx_buffer(DriverSuper *p_super)
受信バッファをクリアする
Definition: driver_super.c:337
const uint8_t * DSSC_get_rx_frame(const DS_StreamConfig *p_stream_config)
確定したフレームを取得
DS_ERR_CODE DS_send_general_cmd(DriverSuper *p_super, uint8_t stream)
継承先の機器に一般コマンドを発行する
Definition: driver_super.c:496
DS_ERR_CODE DS_send_req_tlm_cmd(DriverSuper *p_super, uint8_t stream)
継承先の機器にテレメ要求コマンドを発行する
Definition: driver_super.c:517
@ DS_STREAM_REC_STATUS_FIXED_FRAME
Definition: driver_super.h:179
DS_ERR_CODE
DriverSuper の汎用エラーコード
Definition: driver_super.h:116
@ DS_ERR_CODE_ERR
Definition: driver_super.h:118
@ DS_ERR_CODE_OK
返り値は継承先や IF 先で上書きされるため,OK は 0 であることが必須
Definition: driver_super.h:117
void * ENDIAN_memcpy(void *dest, const void *src, size_t size)
エンディアンを考慮した memcpy
Definition: endian.c:11
void I2C_set_rx_length(void *my_i2c_v, const uint32_t rx_length)
rx_lengthを設定する
Definition: i2c_sils.cpp:40
void I2C_set_stop_flag(void *my_i2c_v, const uint8_t stop_flag)
stop_flagを設定する
DS_ERR_CODE I2C_write_2bytes(DriverSuper *p_super, uint8_t stream, I2C_Config *p_i2c_config, uint8_t register_address, uint16_t data)
I2C_Config 構造体にて指定されたデバイスのレジスタへ 2 バイトデータを書き込む
Definition: i2c_common.c:43
DS_ERR_CODE I2C_write_byte(DriverSuper *p_super, uint8_t stream, I2C_Config *p_i2c_config, uint8_t register_address, uint8_t data)
I2C_Config 構造体にて指定されたデバイスのレジスタへ 1 バイトデータを書き込む
Definition: i2c_common.c:38
static DS_ERR_CODE I2C_write_bytes_(DriverSuper *p_super, uint8_t stream, I2C_Config *p_i2c_config, uint8_t register_address, void *data_v, uint8_t data_len)
I2C_Config 構造体にて指定されたデバイスのレジスタへ書き込む
Definition: i2c_common.c:48
static DS_ERR_CODE I2C_read_bytes_(DriverSuper *p_super, uint8_t stream, I2C_Config *p_i2c_config, uint8_t register_address, void *data_v, uint8_t buffer_size)
I2C_Config 構造体にて指定されたデバイスのレジスタへ読み込む
Definition: i2c_common.c:75
DS_ERR_CODE I2C_read_byte(DriverSuper *p_super, uint8_t stream, I2C_Config *p_i2c_config, uint8_t register_address, uint8_t *data)
I2C_Config 構造体にて指定されたデバイスのレジスタから 1 バイトデータを読み込む
Definition: i2c_common.c:63
DS_ERR_CODE I2C_read_2bytes(DriverSuper *p_super, uint8_t stream, I2C_Config *p_i2c_config, uint8_t register_address, uint16_t *data)
I2C_Config 構造体にて指定されたデバイスのレジスタから 2 バイトデータを読み込む
Definition: i2c_common.c:69
I2C 通信関連の一般 IO 以外の公開関数
DriverSuperStream の設定
Definition: driver_super.h:281
DriverSuper の設定 各 IF はこれを継承してつかう.
Definition: driver_super.h:407
DS_StreamConfig stream_config[DS_STREAM_MAX]
Definition: driver_super.h:414
Definition: i2c.h:21