Commit from zer0 (2007-08-21 23:51 CEST) ---------------- update for i2c
aversive_projects microb2008/extension/main.c 1.5 aversive_projects microb2008/main/.config 1.4 aversive_projects microb2008/main/i2c_protocol.c 1.4 aversive_projects microb2008/main/main.c 1.5 --------------------------------------------- aversive_projects/microb2008/extension/main.c (1.4 -> 1.5) --------------------------------------------- @@ -15,7 +15,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * Revision : $Id: main.c,v 1.4 2007-08-19 10:41:41 zer0 Exp $ + * Revision : $Id: main.c,v 1.5 2007-08-21 21:51:34 zer0 Exp $ * */ @@ -70,8 +70,8 @@ /* i2c */ i2c_init(I2C_MODE_SLAVE, I2C_EXTENSION_ADDR); i2c_register_recv_event(i2c_recvevent); - i2c_register_send_event(i2c_sendevent); - i2c_register_recv_byte_event(i2c_recvbyteevent); + //i2c_register_send_event(i2c_sendevent); + //i2c_register_recv_byte_event(i2c_recvbyteevent); /* debug via i2c (um zu gut zu machen) */ fdevopen(debug_send, NULL); ----------------------------------------- aversive_projects/microb2008/main/.config (1.3 -> 1.4) ----------------------------------------- @@ -1,5 +1,5 @@ # -# Automatically generated by make menuconfig: don't edit +# Automatically generated make config: don't edit # # @@ -70,6 +70,10 @@ # # Base modules # + +# +# Enable math library in generation options to see all modules +# CONFIG_MODULE_CIRBUF=y CONFIG_MODULE_FIXED_POINT=y CONFIG_MODULE_VECT2=y @@ -82,6 +86,10 @@ # # Communication modules # + +# +# uart needs circular buffer, mf2 client may need scheduler +# CONFIG_MODULE_UART=y CONFIG_MODULE_UART_CREATE_CONFIG=y CONFIG_MODULE_I2C=y @@ -145,6 +153,10 @@ # Control system modules # CONFIG_MODULE_CONTROL_SYSTEM_MANAGER=y + +# +# Filters +# CONFIG_MODULE_PID=y # CONFIG_MODULE_RAMP is not set CONFIG_MODULE_QUADRAMP=y @@ -154,6 +166,10 @@ # # Crypto modules # + +# +# Crypto modules depend on utils module +# # CONFIG_MODULE_AES is not set # CONFIG_MODULE_AES_CTR is not set # CONFIG_MODULE_MD5 is not set @@ -163,12 +179,20 @@ # # Encodings modules # + +# +# Encoding modules depend on utils module +# # CONFIG_MODULE_BASE64 is not set # CONFIG_MODULE_HAMMING is not set # # Debug modules # + +# +# Debug modules depend on utils module +# # CONFIG_MODULE_DIAGNOSTIC is not set # CONFIG_MODULE_DIAGNOSTIC_CREATE_CONFIG is not set CONFIG_MODULE_ERROR=y ------------------------------------------------ aversive_projects/microb2008/main/i2c_protocol.c (1.3 -> 1.4) ------------------------------------------------ @@ -15,7 +15,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * Revision : $Id: i2c_protocol.c,v 1.3 2007-08-19 10:41:41 zer0 Exp $ + * Revision : $Id: i2c_protocol.c,v 1.4 2007-08-21 21:51:34 zer0 Exp $ * */ @@ -35,7 +35,14 @@ #include "main.h" #include "i2c_protocol.h" -#define I2C_MAX_CONSECUTIVE_ERRORS 100 +#define I2C_MAX_ERRORS 100 + +static volatile uint8_t i2c_state = 0; +static volatile uint16_t i2c_errors = 0; +static volatile uint8_t poll_is_running = 0; + +/* XXX */ +extern volatile uint8_t g_status; void i2c_protocol_init(void) { @@ -44,49 +51,82 @@ void i2c_poll_slaves(void * dummy) { - static uint8_t state = 0; - static uint8_t errors = 0; + uint8_t flags; + int8_t err; - switch(state) { + IRQ_LOCK(flags); + poll_is_running ++; + switch(i2c_state) { /* poll debug buffer */ case 0: - if(i2c_req_read_debug_buffer()) + if((err=i2c_req_read_debug_buffer())) goto error; break; case 1: - if(i2c_recv(I2C_EXTENSION_ADDR, + if((err=i2c_recv(I2C_EXTENSION_ADDR, sizeof(struct i2c_ans_write_debug_buffer), - I2C_CTRL_GENERIC)) + I2C_CTRL_GENERIC))) goto error; break; /* nothing, loop to the first request */ default: - state = 0; - return; - + i2c_state = 0; } - - state ++; + IRQ_UNLOCK(flags); return; error: - errors++; - if (errors > I2C_MAX_CONSECUTIVE_ERRORS) { + poll_is_running --; + IRQ_UNLOCK(flags); + i2c_errors++; + if (i2c_errors > I2C_MAX_ERRORS) { /* XXX use ERROR() log instead */ - printf("I2C error, slave not ready\n"); - errors = 0; + printf("I2C error, cannot send %d %d %x\n", i2c_state, err, g_status); + i2c_errors = 0; + } +} + +void i2c_sendevent(int8_t size) +{ + if (size > 0) { + if (poll_is_running) { + i2c_state ++; + } + } + else { + i2c_errors++; + printf("error %d\n", i2c_state); + if (i2c_errors > I2C_MAX_ERRORS) { + /* XXX use ERROR() log instead */ + printf("I2C error, slave not ready\n"); + i2c_errors = 0; + } } + poll_is_running = 0; } void i2c_recvevent(uint8_t * buf, int8_t size) { - if (size < 1) { - goto error; + if (size > 0) { + if (poll_is_running) { + i2c_state ++; + } + } + else { + i2c_errors++; + printf("error %d\n", i2c_state); + if (i2c_errors > I2C_MAX_ERRORS) { + /* XXX use ERROR() log instead */ + LED2_ON(); + printf("I2C error, slave not ready\n"); + i2c_errors = 0; + } } + poll_is_running = 0; switch (buf[0]) { case I2C_ANS_WRITE_DEBUG_BUFFER: @@ -96,7 +136,7 @@ (struct i2c_ans_write_debug_buffer * )buf; if (size != sizeof (*ans)) - goto error; + break; /* we may loose chars here, if the uart fifo is full */ for (i=0 ; i<sizeof(ans->buf) && ans->buf[i] != 0 ; i++) { @@ -106,12 +146,8 @@ } default: - goto error; + break; } - - error: - /* log error on a led ? */ - return; } void i2c_recvbyteevent(uint8_t hwstatus, uint8_t i, uint8_t c) @@ -123,10 +159,6 @@ /* } */ } -void i2c_sendevent(int8_t size) -{ - printf("send event %d\n", size); -} /* ******** ******** ******** ******** */ ---------------------------------------- aversive_projects/microb2008/main/main.c (1.4 -> 1.5) ---------------------------------------- @@ -15,7 +15,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * Revision : $Id: main.c,v 1.4 2007-08-19 10:45:41 zer0 Exp $ + * Revision : $Id: main.c,v 1.5 2007-08-21 21:51:34 zer0 Exp $ * */ @@ -273,7 +273,7 @@ i2c_register_send_event(i2c_sendevent); /* i2c_register_recv_byte_event(i2c_recvbyteevent); */ /* not needed */ scheduler_add_periodical_event_priority(i2c_poll_slaves, NULL, - 1000L / SCHEDULER_UNIT, I2C_POLL_PRIO); + 1300L / SCHEDULER_UNIT, I2C_POLL_PRIO); /* XXX also remove sei(), put it after all inits */ Commit from zer0 on branch b_zer0 (2007-08-21 23:51 CEST) --------------------------------- small fixes aversive modules/comm/i2c/i2c.c 1.1.2.8 ------------------------------- aversive/modules/comm/i2c/i2c.c (1.1.2.7 -> 1.1.2.8) ------------------------------- @@ -15,7 +15,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * Revision : $Id: i2c.c,v 1.1.2.7 2007-08-19 10:38:06 zer0 Exp $ + * Revision : $Id: i2c.c,v 1.1.2.8 2007-08-21 21:51:59 zer0 Exp $ * */ @@ -107,7 +107,8 @@ static void (*g_send_event)(int8_t) = NULL; static volatile i2c_mode_t g_mode = I2C_MODE_UNINIT; -static volatile uint8_t g_status = I2C_STATUS_READY; +volatile uint8_t g_status = I2C_STATUS_READY;/* XXX */ + static volatile uint8_t g_ctrl = 0; /* ctrl flags */ static volatile uint8_t g_sync_res = 0; /* result of sync send */ static uint8_t g_send_buf[I2C_SEND_BUFFER_SIZE]; @@ -375,19 +376,16 @@ IRQ_UNLOCK(flags); return ENXIO; } - LED2_ON(); if (g_status != I2C_STATUS_READY) { IRQ_UNLOCK(flags); return EBUSY; } - LED3_ON(); if (size > I2C_SEND_BUFFER_SIZE) { /* XXX is size=0 ok ? */ IRQ_UNLOCK(flags); return EINVAL; } - LED4_ON(); if (g_mode == I2C_MODE_SLAVE || dest_add >= I2C_ADD_MASTER) { IRQ_UNLOCK(flags); @@ -522,9 +520,15 @@ { uint8_t hard_status; uint8_t command = (1<<TWINT) | (1<<TWEN) | (1<<TWIE); + static char a=0; hard_status = TW_STATUS; + if(a) + LED7_OFF(); + else + LED7_ON(); + a = !a; switch(hard_status) { #ifdef CONFIG_MODULE_I2C_MASTER _______________________________________________ Avr-list mailing list Avr-list@droids-corp.org CVSWEB : http://cvsweb.droids-corp.org/cgi-bin/viewcvs.cgi/aversive WIKI : http://wiki.droids-corp.org/index.php/Aversive DOXYGEN : http://zer0.droids-corp.org/doxygen_aversive/html/ BUGZILLA : http://bugzilla.droids-corp.org COMMIT LOGS : http://zer0.droids-corp.org/aversive_commitlog