00001
00108 #include <avr32/io.h>
00109 #include "board.h"
00110 #include "print_funcs.h"
00111 #include "gpio.h"
00112 #include "pm.h"
00113 #include "intc.h"
00114 #include "twi.h"
00115
00116
00117
00118
00119 #define EEPROM_ADDRESS 0x50 // EEPROM's TWI address
00120 #define EEPROM_ADDR_LGT 3 // Address length of the EEPROM memory
00121 #define VIRTUALMEM_ADDR_START 0x123456 // Address of the virtual mem in the EEPROM
00122 #define TWI_SPEED 50000 // Speed of TWI
00123
00124
00125
00127 #define PATTERN_TEST_LENGTH (sizeof(test_pattern)/sizeof(U8))
00128 const U8 test_pattern[] = {
00129 0xAA,
00130 0x55,
00131 0xA5,
00132 0x5A,
00133 0x77,
00134 0x99};
00135
00136
00137
00138
00139
00140
00142 #define TWI_MEM_SIZE 20 // The size of the virtual mem
00143 #define TWI_MEM_IDLE 0 // Idle state
00144 #define TWI_MEM_ADDR 1 // Address state
00145 #define TWI_MEM_DATA 2 // Data state
00146 U8 s_status_cmd = TWI_MEM_IDLE;
00147 U8 s_u8_addr_pos;
00148 U32 s_u32_addr;
00149 U8 s_memory[TWI_MEM_SIZE]={0};
00150
00151
00154 static void twi_slave_rx( U8 u8_value )
00155 {
00156
00157 switch( s_status_cmd )
00158 {
00159 case TWI_MEM_IDLE:
00160 s_u8_addr_pos = EEPROM_ADDR_LGT;
00161 s_u32_addr = 0;
00162
00163
00164 case TWI_MEM_ADDR:
00165 s_u8_addr_pos--;
00166
00167 s_u32_addr += ((U32)u8_value << (s_u8_addr_pos*8));
00168 if( 0 == s_u8_addr_pos )
00169 {
00170 s_status_cmd = TWI_MEM_DATA;
00171 }else{
00172 s_status_cmd = TWI_MEM_ADDR;
00173 }
00174 break;
00175
00176 case TWI_MEM_DATA:
00177
00178 if( TWI_MEM_SIZE > (s_u32_addr-VIRTUALMEM_ADDR_START) )
00179 {
00180 s_memory[s_u32_addr-VIRTUALMEM_ADDR_START] = u8_value;
00181 }
00182 s_u32_addr++;
00183 break;
00184 }
00185 }
00186
00189 static U8 twi_slave_tx( void )
00190 {
00191 U8 u8_value;
00192
00193
00194
00195 s_status_cmd = TWI_MEM_DATA;
00196
00197 if( TWI_MEM_SIZE > (s_u32_addr-VIRTUALMEM_ADDR_START) )
00198 {
00199 u8_value = s_memory[s_u32_addr-VIRTUALMEM_ADDR_START];
00200 }else{
00201 u8_value = 0xFF;
00202 }
00203 s_u32_addr++;
00204 return u8_value;
00205 }
00206
00207
00210 static void twi_slave_stop( void )
00211 {
00212 s_status_cmd = TWI_MEM_IDLE;
00213 }
00214
00215
00218 int main(void)
00219 {
00220 static const gpio_map_t TWI_GPIO_MAP =
00221 {
00222 {AVR32_TWI_SDA_0_0_PIN, AVR32_TWI_SDA_0_0_FUNCTION},
00223 {AVR32_TWI_SCL_0_0_PIN, AVR32_TWI_SCL_0_0_FUNCTION}
00224 };
00225 twi_options_t opt;
00226 twi_slave_fct_t twi_slave_fct;
00227 int status;
00228
00229
00230 pm_switch_to_osc0(&AVR32_PM, FOSC0, OSC0_STARTUP);
00231
00232
00233 init_dbg_rs232(FOSC0);
00234
00235
00236 print_dbg("\x0C\r\nTWI Example\r\nSlave!\r\n");
00237
00238
00239 gpio_enable_module(TWI_GPIO_MAP, sizeof(TWI_GPIO_MAP) / sizeof(TWI_GPIO_MAP[0]));
00240
00241
00242 opt.pba_hz = FOSC0;
00243 opt.speed = TWI_SPEED;
00244 opt.chip = EEPROM_ADDRESS;
00245
00246
00247 twi_slave_fct.rx = &twi_slave_rx;
00248 twi_slave_fct.tx = &twi_slave_tx;
00249 twi_slave_fct.stop = &twi_slave_stop;
00250 status = twi_slave_init(&AVR32_TWI, &opt, &twi_slave_fct );
00251
00252 if (status == TWI_SUCCESS)
00253 {
00254
00255 print_dbg("Slave start:\tPASS\r\n");
00256 }
00257 else
00258 {
00259
00260 print_dbg("slave start:\tFAIL\r\n");
00261 }
00262
00263 while(1);
00264 }