diff --git a/include/at91_twi.h b/include/at91_twi.h index dc69ee2..7827c49 100644 --- a/include/at91_twi.h +++ b/include/at91_twi.h @@ -25,10 +25,38 @@ //#define CMD_GET_INFO 0x10 #define CMD_SET_PWM 0x21 #define CMD_GET_STATUS 0x22 -//#define CMD_SET_PARAM 0x23 -//#define CMD_GET_PARAM 0x24 +#define CMD_SET_PARAM 0x23 +#define CMD_GET_PARAM 0x24 #define CMD_BOOT_LOADER 0x2F +struct blmc_status { + uint8_t pwm_ist; + uint8_t pwm_soll; + + uint16_t rpm; + uint16_t current; + uint16_t voltage; +} __attribute__ ((packed)); + +struct blmc_param { + uint16_t spinup_ticks; + + uint8_t spinup_tick; + uint8_t spinup_step; + + uint8_t spinup_wait; + uint8_t spinup_pwm; + + uint8_t pwm_min; + uint8_t pwm_max; + + uint16_t current_limit; + uint16_t current_max; + + uint16_t voltage_min; + + uint16_t crc16; +} __attribute__ ((packed)); struct blmc_cmd { uint32_t cmd; /* cmd byte(s) */ diff --git a/main.c b/main.c index 477de44..e0ab79f 100644 --- a/main.c +++ b/main.c @@ -49,6 +49,10 @@ static uint32_t pitc_test(struct pitc_timer *timer) printf("\r"); */ + + static uint8_t data[4] = { 0x0f, 0x0f, 0x0f, 0x0f }; + twi_setpwm(data); + return PITC_RESTART_TIMER; } @@ -77,9 +81,6 @@ int main(void) at91_rttc_test_init(); at91_tc1_init(); - /* adc, need timer */ - at91_adc_test_init(); - /* twi */ at91_twi_init(); at91_twi_test(); @@ -89,6 +90,9 @@ int main(void) printf("static alloc: %5ld bytes\n\r", static_alloc_used()); + /* adc, need timer */ +// at91_adc_test_init(); + pitc_schedule_timer(&pitc_test_timer); while (1); diff --git a/src/at91_adc.c b/src/at91_adc.c index e5a1e15..2b0d34a 100644 --- a/src/at91_adc.c +++ b/src/at91_adc.c @@ -42,7 +42,7 @@ static uint32_t adc_trigger(struct pitc_timer *timer) { uint32_t i; for (i = 0; i < ARRAY_SIZE(adc_result); i++) - printf("0x%03x ", adc_result[i]); + printf("%+4d ", 0x200 - adc_result[i]); printf("\n\r"); @@ -51,7 +51,7 @@ static uint32_t adc_trigger(struct pitc_timer *timer) } static struct pitc_timer adc_timer = { - .interval = 10, + .interval = 100, .func = &adc_trigger, }; @@ -94,5 +94,5 @@ void at91_adc_test_init(void) aic->AIC_SVR[AT91C_ID_ADC] = (uint32_t)at91_adc_isr; aic->AIC_IECR = (1<> 16) & 0x7F; /* are we doing a blmc update? */ - if (twi_state == TWI_BLMC_UPDATE) { - uint32_t addr = (*AT91C_TWI_MMR >> 16) & 0x7F; - if (addr != TWI_ADDR_BL4) { - /* increase address */ - *AT91C_TWI_MMR += (1<<16); + if (twi_state == TWI_BLMC_UPDATE && addr != TWI_ADDR_BL4) { + /* increase address */ + *AT91C_TWI_MMR += (1<<16); - /* send next value to next blmc */ - *AT91C_TWI_THR = *twi_data++; - } else { - // TODO: - } + /* send next value to next blmc */ + *AT91C_TWI_THR = *twi_data++; } else { *AT91C_TWI_IDR = AT91C_TWI_TXCOMP | AT91C_TWI_RXRDY | AT91C_TWI_TXRDY | AT91C_TWI_NACK; @@ -118,11 +114,14 @@ static void twi_isr(void) uint32_t twi_setpwm(uint8_t *values) { + if (twi_state == TWI_ERROR) + twi_state = TWI_IDLE; + if (twi_state != TWI_IDLE) return 1; twi_state = TWI_BLMC_UPDATE; - twi_data = values; /* data is not copied! */ + twi_data = values; twi_size = 0; twi_count = 0; @@ -137,6 +136,9 @@ uint32_t twi_setpwm(uint8_t *values) uint32_t twi_cmd(uint8_t addr, struct blmc_cmd *cmd) { + if (twi_state == TWI_ERROR) + twi_state = TWI_IDLE; + if (twi_state != TWI_IDLE) return 1; @@ -189,42 +191,63 @@ void at91_twi_test(void) { uint32_t i; for (i = TWI_ADDR_BL1; i <= TWI_ADDR_BL4; i++) { + printf("twi[0x%02lx] ", i); + struct blmc_cmd cmd = { .cmd = CMD_BOOT_LOADER, .mode = BLMC_CMD_WRITE | BLMC_CMD_0_ARG, }; - uint32_t ret = twi_cmd(i, &cmd); - printf("twi[0x%02lx](%ld) ", i, ret); + twi_cmd(i, &cmd); + /* TODO: sleep */ volatile uint32_t x; for (x = 0; x < 200000; x++); uint8_t buf[16]; - cmd.cmd = CMD_GET_INFO, - cmd.mode = BLMC_CMD_READ | BLMC_CMD_0_ARG, - cmd.size = sizeof(buf), - cmd.data = buf, - ret = twi_cmd(i, &cmd); - printf("boot(%ld):'%s' ", ret, buf); + buf[0] = '\0'; + cmd.cmd = CMD_GET_INFO; + cmd.mode = BLMC_CMD_READ | BLMC_CMD_0_ARG; + cmd.size = sizeof(buf); + cmd.data = buf; + twi_cmd(i, &cmd); + printf("boot:'%s' ", buf); + + /* TODO: single 32bit write */ + buf[0] = 0xFF; + buf[1] = 0xFF; + buf[2] = 0xFF; cmd.cmd = CMD_GET_SIGNATURE; cmd.size = 4; - ret = twi_cmd(i, &cmd); - printf("sig(%ld):0x%02x%02x%02x ", ret, buf[0], buf[1], buf[2]); + twi_cmd(i, &cmd); + printf("sig:0x%02x%02x%02x\n\r", buf[0], buf[1], buf[2]); cmd.cmd = CMD_BOOT_APPLICATION; cmd.mode = BLMC_CMD_WRITE | BLMC_CMD_0_ARG; cmd.size = 0; - ret = twi_cmd(i, &cmd); + twi_cmd(i, &cmd); + /* TODO: sleep */ for (x = 0; x < 200000; x++); - cmd.cmd = CMD_GET_INFO, - cmd.mode = BLMC_CMD_READ | BLMC_CMD_0_ARG, - cmd.size = sizeof(buf), - cmd.data = buf, - ret = twi_cmd(i, &cmd); - printf("app(%ld):'%s'\n\r", ret, buf); + buf[0] = '\0'; + cmd.cmd = CMD_GET_INFO; + cmd.mode = BLMC_CMD_READ | BLMC_CMD_0_ARG; + cmd.size = sizeof(buf); + cmd.data = buf; + twi_cmd(i, &cmd); + printf(" app :'%s' ", buf); + + struct blmc_param param; + cmd.cmd = CMD_GET_PARAM; + cmd.mode = BLMC_CMD_READ | BLMC_CMD_0_ARG; + cmd.size = sizeof(param); + cmd.data = (uint8_t *)¶m; + twi_cmd(i, &cmd); + + printf("pwm:0x%02x-0x%02x Ilimit:0x%03x Imax:0x%03x\n\r", + param.pwm_min, param.pwm_max, + param.current_limit, param.current_max); } }