blmc setpwm communication

This commit is contained in:
Olaf Rempel 2008-03-05 15:33:44 +01:00
parent a81d25a84d
commit c4227fbabb
5 changed files with 92 additions and 37 deletions

View File

@ -25,10 +25,38 @@
//#define CMD_GET_INFO 0x10 //#define CMD_GET_INFO 0x10
#define CMD_SET_PWM 0x21 #define CMD_SET_PWM 0x21
#define CMD_GET_STATUS 0x22 #define CMD_GET_STATUS 0x22
//#define CMD_SET_PARAM 0x23 #define CMD_SET_PARAM 0x23
//#define CMD_GET_PARAM 0x24 #define CMD_GET_PARAM 0x24
#define CMD_BOOT_LOADER 0x2F #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 { struct blmc_cmd {
uint32_t cmd; /* cmd byte(s) */ uint32_t cmd; /* cmd byte(s) */

10
main.c
View File

@ -49,6 +49,10 @@ static uint32_t pitc_test(struct pitc_timer *timer)
printf("\r"); printf("\r");
*/ */
static uint8_t data[4] = { 0x0f, 0x0f, 0x0f, 0x0f };
twi_setpwm(data);
return PITC_RESTART_TIMER; return PITC_RESTART_TIMER;
} }
@ -77,9 +81,6 @@ int main(void)
at91_rttc_test_init(); at91_rttc_test_init();
at91_tc1_init(); at91_tc1_init();
/* adc, need timer */
at91_adc_test_init();
/* twi */ /* twi */
at91_twi_init(); at91_twi_init();
at91_twi_test(); at91_twi_test();
@ -89,6 +90,9 @@ int main(void)
printf("static alloc: %5ld bytes\n\r", static_alloc_used()); printf("static alloc: %5ld bytes\n\r", static_alloc_used());
/* adc, need timer */
// at91_adc_test_init();
pitc_schedule_timer(&pitc_test_timer); pitc_schedule_timer(&pitc_test_timer);
while (1); while (1);

View File

@ -42,7 +42,7 @@ static uint32_t adc_trigger(struct pitc_timer *timer)
{ {
uint32_t i; uint32_t i;
for (i = 0; i < ARRAY_SIZE(adc_result); 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"); printf("\n\r");
@ -51,7 +51,7 @@ static uint32_t adc_trigger(struct pitc_timer *timer)
} }
static struct pitc_timer adc_timer = { static struct pitc_timer adc_timer = {
.interval = 10, .interval = 100,
.func = &adc_trigger, .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_SVR[AT91C_ID_ADC] = (uint32_t)at91_adc_isr;
aic->AIC_IECR = (1<<AT91C_ID_ADC); aic->AIC_IECR = (1<<AT91C_ID_ADC);
// pitc_schedule_timer(&adc_timer); pitc_schedule_timer(&adc_timer);
} }

View File

@ -73,7 +73,7 @@ void at91_pitc_init(void)
{ {
sysc_register_isr(AT91_SYSIRQ_PIT, &pitc_isr); sysc_register_isr(AT91_SYSIRQ_PIT, &pitc_isr);
*AT91C_PITC_PIMR = (AT91C_PITC_PIV & HZ_TO_PIV(100)) | *AT91C_PITC_PIMR = (AT91C_PITC_PIV & HZ_TO_PIV(1000)) |
AT91C_PITC_PITEN | AT91C_PITC_PITEN |
AT91C_PITC_PITIEN; AT91C_PITC_PITIEN;
} }

View File

@ -95,19 +95,15 @@ static void twi_isr(void)
/* transfer really complete? */ /* transfer really complete? */
if (status & AT91C_TWI_TXCOMP) { if (status & AT91C_TWI_TXCOMP) {
uint32_t addr = (*AT91C_TWI_MMR >> 16) & 0x7F;
/* are we doing a blmc update? */ /* are we doing a blmc update? */
if (twi_state == TWI_BLMC_UPDATE) { if (twi_state == TWI_BLMC_UPDATE && addr != TWI_ADDR_BL4) {
uint32_t addr = (*AT91C_TWI_MMR >> 16) & 0x7F; /* increase address */
if (addr != TWI_ADDR_BL4) { *AT91C_TWI_MMR += (1<<16);
/* increase address */
*AT91C_TWI_MMR += (1<<16);
/* send next value to next blmc */ /* send next value to next blmc */
*AT91C_TWI_THR = *twi_data++; *AT91C_TWI_THR = *twi_data++;
} else {
// TODO:
}
} else { } else {
*AT91C_TWI_IDR = AT91C_TWI_TXCOMP | AT91C_TWI_RXRDY | AT91C_TWI_TXRDY | AT91C_TWI_NACK; *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) uint32_t twi_setpwm(uint8_t *values)
{ {
if (twi_state == TWI_ERROR)
twi_state = TWI_IDLE;
if (twi_state != TWI_IDLE) if (twi_state != TWI_IDLE)
return 1; return 1;
twi_state = TWI_BLMC_UPDATE; twi_state = TWI_BLMC_UPDATE;
twi_data = values; /* data is not copied! */ twi_data = values;
twi_size = 0; twi_size = 0;
twi_count = 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) 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) if (twi_state != TWI_IDLE)
return 1; return 1;
@ -189,42 +191,63 @@ void at91_twi_test(void)
{ {
uint32_t i; uint32_t i;
for (i = TWI_ADDR_BL1; i <= TWI_ADDR_BL4; i++) { for (i = TWI_ADDR_BL1; i <= TWI_ADDR_BL4; i++) {
printf("twi[0x%02lx] ", i);
struct blmc_cmd cmd = { struct blmc_cmd cmd = {
.cmd = CMD_BOOT_LOADER, .cmd = CMD_BOOT_LOADER,
.mode = BLMC_CMD_WRITE | BLMC_CMD_0_ARG, .mode = BLMC_CMD_WRITE | BLMC_CMD_0_ARG,
}; };
uint32_t ret = twi_cmd(i, &cmd); twi_cmd(i, &cmd);
printf("twi[0x%02lx](%ld) ", i, ret);
/* TODO: sleep */
volatile uint32_t x; volatile uint32_t x;
for (x = 0; x < 200000; x++); for (x = 0; x < 200000; x++);
uint8_t buf[16]; uint8_t buf[16];
cmd.cmd = CMD_GET_INFO, buf[0] = '\0';
cmd.mode = BLMC_CMD_READ | BLMC_CMD_0_ARG, cmd.cmd = CMD_GET_INFO;
cmd.size = sizeof(buf), cmd.mode = BLMC_CMD_READ | BLMC_CMD_0_ARG;
cmd.data = buf, cmd.size = sizeof(buf);
ret = twi_cmd(i, &cmd); cmd.data = buf;
printf("boot(%ld):'%s' ", ret, 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.cmd = CMD_GET_SIGNATURE;
cmd.size = 4; cmd.size = 4;
ret = twi_cmd(i, &cmd); twi_cmd(i, &cmd);
printf("sig(%ld):0x%02x%02x%02x ", ret, buf[0], buf[1], buf[2]); printf("sig:0x%02x%02x%02x\n\r", buf[0], buf[1], buf[2]);
cmd.cmd = CMD_BOOT_APPLICATION; cmd.cmd = CMD_BOOT_APPLICATION;
cmd.mode = BLMC_CMD_WRITE | BLMC_CMD_0_ARG; cmd.mode = BLMC_CMD_WRITE | BLMC_CMD_0_ARG;
cmd.size = 0; cmd.size = 0;
ret = twi_cmd(i, &cmd); twi_cmd(i, &cmd);
/* TODO: sleep */
for (x = 0; x < 200000; x++); for (x = 0; x < 200000; x++);
cmd.cmd = CMD_GET_INFO, buf[0] = '\0';
cmd.mode = BLMC_CMD_READ | BLMC_CMD_0_ARG, cmd.cmd = CMD_GET_INFO;
cmd.size = sizeof(buf), cmd.mode = BLMC_CMD_READ | BLMC_CMD_0_ARG;
cmd.data = buf, cmd.size = sizeof(buf);
ret = twi_cmd(i, &cmd); cmd.data = buf;
printf("app(%ld):'%s'\n\r", ret, 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 *)&param;
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);
} }
} }