|
@@ -13,32 +13,67 @@
|
|
#include "ADRS2040U_i2c.h"
|
|
#include "ADRS2040U_i2c.h"
|
|
#include "adc_driver.hpp"
|
|
#include "adc_driver.hpp"
|
|
|
|
|
|
|
|
+// ADCドライバ
|
|
ADC_Driver adcd;
|
|
ADC_Driver adcd;
|
|
|
|
|
|
|
|
+typedef union {
|
|
|
|
+ uint16_t d;
|
|
|
|
+ uint8_t b[2];
|
|
|
|
+} WORD_t;
|
|
|
|
+
|
|
|
|
+
|
|
static void i2c_slave_handler(i2c_inst_t *i2c, i2c_slave_event_t event)
|
|
static void i2c_slave_handler(i2c_inst_t *i2c, i2c_slave_event_t event)
|
|
{
|
|
{
|
|
static uint8_t ADRS2040U_cmd = ADRS2040_CMD_INVALID;
|
|
static uint8_t ADRS2040U_cmd = ADRS2040_CMD_INVALID;
|
|
- uint8_t raw_data;
|
|
|
|
|
|
|
|
switch(event) {
|
|
switch(event) {
|
|
|
|
+ // I2Cデータ受信
|
|
case I2C_SLAVE_RECEIVE:
|
|
case I2C_SLAVE_RECEIVE:
|
|
- raw_data = i2c_read_byte_raw(i2c);
|
|
|
|
if(ADRS2040U_cmd == ADRS2040_CMD_INVALID) {
|
|
if(ADRS2040U_cmd == ADRS2040_CMD_INVALID) {
|
|
- ADRS2040U_cmd = raw_data;
|
|
|
|
|
|
+ ADRS2040U_cmd = i2c_read_byte_raw(i2c);
|
|
|
|
+ }
|
|
|
|
+ if(ADRS2040U_cmd == ADRS2040_CMD_ADC_START) {
|
|
|
|
+ adcd.run(true);
|
|
|
|
+ ADRS2040U_cmd = ADRS2040_CMD_INVALID;
|
|
|
|
+ }
|
|
|
|
+ else if(ADRS2040U_cmd == ADRS2040_CMD_ADC_STOP) {
|
|
|
|
+ adcd.run(false);
|
|
|
|
+ ADRS2040U_cmd = ADRS2040_CMD_INVALID;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ else if(ADRS2040U_cmd == ADRS2040_CMD_SET_RATE) {
|
|
|
|
+ WORD_t rate;
|
|
|
|
+ i2c_read_raw_blocking(i2c, rate.b, sizeof(WORD_t));
|
|
|
|
+ DEBUG_PRINT("Rate = %d\n", rate.d * 10);
|
|
|
|
+ adcd.set_sample_rate(rate.d * 10);
|
|
|
|
+ ADRS2040U_cmd = ADRS2040_CMD_INVALID;
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
-
|
|
|
|
|
|
+
|
|
|
|
+ // I2Cデータ要求
|
|
case I2C_SLAVE_REQUEST:
|
|
case I2C_SLAVE_REQUEST:
|
|
- DEBUG_PRINT("I2C_SLAVE_REQUEST\n");
|
|
|
|
|
|
+ WORD_t sdata;
|
|
|
|
+ sdata.d = 0;
|
|
|
|
+
|
|
if(ADRS2040U_cmd == ADRS2040_CMD_GET_COUNT) {
|
|
if(ADRS2040U_cmd == ADRS2040_CMD_GET_COUNT) {
|
|
- i2c_write_byte_raw(i2c,adcd.count());
|
|
|
|
|
|
+ sdata.d = adcd.count();
|
|
}
|
|
}
|
|
- else
|
|
|
|
- i2c_write_byte_raw(i2c, 0);
|
|
|
|
- break;
|
|
|
|
|
|
+ else if(ADRS2040U_cmd == ADRS2040_CMD_GET_VALUE) {
|
|
|
|
+ int value = adcd.get_value();
|
|
|
|
|
|
- case I2C_SLAVE_FINISH:
|
|
|
|
|
|
+ if( value >= 0) {
|
|
|
|
+ sdata.d = value & 0xFFF;
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ sdata.d = 0xFFFF;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ i2c_write_raw_blocking(i2c, sdata.b, sizeof(WORD_t));
|
|
ADRS2040U_cmd = ADRS2040_CMD_INVALID;
|
|
ADRS2040U_cmd = ADRS2040_CMD_INVALID;
|
|
|
|
+
|
|
|
|
+ break;
|
|
|
|
+ // STOP or RESTARTコンデション
|
|
|
|
+ case I2C_SLAVE_FINISH:
|
|
break;
|
|
break;
|
|
|
|
|
|
default:
|
|
default:
|
|
@@ -46,8 +81,6 @@ static void i2c_slave_handler(i2c_inst_t *i2c, i2c_slave_event_t event)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
-
|
|
|
|
void i2c_setup(void)
|
|
void i2c_setup(void)
|
|
{
|
|
{
|
|
i2c_init(i2c0, 100 * 1000);
|
|
i2c_init(i2c0, 100 * 1000);
|
|
@@ -60,13 +93,14 @@ void i2c_setup(void)
|
|
// プルアップする場合は以下の通り
|
|
// プルアップする場合は以下の通り
|
|
// gpio_pull_up(GPIO_SDA0);
|
|
// gpio_pull_up(GPIO_SDA0);
|
|
// gpio_pull_up(GPIO_SCK0);
|
|
// gpio_pull_up(GPIO_SCK0);
|
|
-
|
|
|
|
|
|
+ // I2Cスレーブ初期化
|
|
i2c_slave_init(i2c0, I2C0_SLAVE_ADDR, &i2c_slave_handler);
|
|
i2c_slave_init(i2c0, I2C0_SLAVE_ADDR, &i2c_slave_handler);
|
|
}
|
|
}
|
|
|
|
|
|
int main(void)
|
|
int main(void)
|
|
{
|
|
{
|
|
stdio_init_all();
|
|
stdio_init_all();
|
|
|
|
+ i2c_setup();
|
|
while (true)
|
|
while (true)
|
|
{
|
|
{
|
|
;
|
|
;
|