私はI2Cに送信するデータを持つ配列を移入しています、以下の私のコードは、私がやっているかを示しています。私にはこれは恐ろしいものです。誰かがお勧めできる、より良い/より良い方法がありますか?C - 静的データと取り込む構造の方法
おかげ
#define DS1337_SECONDS_REG 0x00
// Default values used for initialisation
#define DS1337_DEFAULT_SECONDS 0x00
#define DS1337_DEFAULT_MINUTES 0x00
#define DS1337_DEFAULT_HOURS_HR_MODE 0x40
#define DS1337_DEFAULT_DAY 0x00 /* Sun */
#define DS1337_DEFAULT_DATE 0x01
#define DS1337_DEFAULT_MONTH 0x01
#define DS1337_DEFAULT_YEAR 0x0C /* 2012 */
#define DS1337_DEFAULT_ALM1_SECS 0x00
#define DS1337_DEFAULT_ALM1_MINS 0x00
#define DS1337_DEFAULT_ALM1_HRS 0x00
#define DS1337_DEFAULT_ALM1_DAY_DATE 0x00
#define DS1337_DEFAULT_ALM2_MINS 0x00
#define DS1337_DEFAULT_ALM2_HRS 0x00
#define DS1337_DEFAULT_ALM2_DAY_DATE 0x00
extern i2c_err_t i2c_send(const i2c_ch_t channel, const uint8_t data[], const uint32_t length, const i2c_stop_t stop);
rtc_err_t ds1337_init(void)
{
uint8_t data_to_send[17] = { DS1337_SECONDS_REG, /* Address of first register */
DS1337_DEFAULT_SECONDS, DS1337_DEFAULT_MINUTES, DS1337_DEFAULT_HOURS_HR_MODE,
DS1337_DEFAULT_DAY, DS1337_DEFAULT_DATE, DS1337_DEFAULT_MONTH, DS1337_DEFAULT_YEAR,
DS1337_DEFAULT_ALM1_SECS, DS1337_DEFAULT_ALM1_MINS, DS1337_DEFAULT_ALM1_HRS, DS1337_DEFAULT_ALM1_DAY_DATE,
DS1337_DEFAULT_ALM2_MINS, DS1337_DEFAULT_ALM2_HRS, DS1337_DEFAULT_ALM2_DAY_DATE,
DS1337_CTRL_REG_INIT_VAL, /* Turn off the squarewave output pin */
DS1337_CLEAR_STATUS_VAL /* Clear the status registers */
};
if (i2c_set_address(DS1337_CHANNEL, DS1337_SPI_ADDRESS) != I2C_NO_ERROR)
return RTC_I2C_ADDRESS_ERROR;
if (i2c_send(DS1337_CHANNEL, data_to_send, sizeof(data_to_send), STOP_CONDITION) != I2C_NO_ERROR)
return RTC_I2C_SEND_ERROR;
//enable_interrupts(GLOBAL);
return RTC_NO_ERROR;
}
かなり標準的なアプローチです。列挙型(定義の代わりに)は、ソースコードをもっと短くしません。コード内で定数をハードコーディングすると、コードを読むことができなくなります。 'i2c_send()'への複数の呼び出しと配列の呼び出しは、おそらく少し大きめで読みにくいものの、ほぼ同じになります。すべての小さなものを設定するための多くの関数を定義することは、ソースコードを大きくするための確実な方法です。私はたぶんコードをそのまま保つだろう。 –
答えを@Alex –
@NiklasHansson:doneにしてください。 –