Hola de nuevo!
A ver...vamos por partes sí xD Yo hice pruebas y hago, para comprobar que la USART funciona correctamente. De hecho, hago bastante debug a través del RS232, que nose si interfiere en algo de lo que yo quiero, pero sí, funcionar funciona a la perfección. Y efectivamente, cuando puse "Prueba\n", en el terminal me salia reflejado, del mismo modo que cuando enviaba el hexadecimal 0x60, me salía la " ' " (si si la comilla esa que se corresponde en ASCII al 60 hex), por lo que entiendo que tampoco me hace falta realizar ningún desplazamiento ni nada, si envio el 0x61 recibo una "a" en el terminal, osea que es todo correcto.
Es posible que esté haciendo algo mal...La dirección I2C del medidor SRF02 por defecto es 0xE0, pero por otro lado, el único registro en el que se puede escribir es el 0x00 (tiene 5 más pero son sólo de lectura, para las mediciones). Mira, este es el código que por defecto trae la placa como ejemplo del uso del TWI. Está pensado para hacer funcionar dos placas, una en modo TWI Maestro y la otra en Esclavo. Es evidente que yo sólo tengo una pero bueno, la cuestión es que usando estos mismos ejemplos, creo que no hace nada:
#include <avr32/io.h>
#include "board.h"
#include "print_funcs.h"
#include "gpio.h"
#include "pm.h"
#include "intc.h"
#include "twi.h"
//------------------ C O N F I G U R A T I O N S -------------------
#define EEPROM_ADDRESS 0xE0 // EEPROM's TWI address
#define EEPROM_ADDR_LGT 1 // Address length of the EEPROM memory
#define VIRTUALMEM_ADDR_START 0xE0 // Address of the virtual mem in the EEPROM
#define TWI_SPEED 9600 // Speed of TWI
//------------------ D E F I N I T I O N S -------------------
// Constants to define the sent and received pattern
#define PATTERN_TEST_LENGTH (sizeof(test_pattern)/sizeof(U8))
const U8 test_pattern[] = {
0x00,
0x60};
//--------------------------------------------------------------------------------------------------------------
//----------------------------------------- T W I M A S T E R ------------------------------------------------
//--------------------------------------------------------------------------------------------------------------
int main(void)
{
static const gpio_map_t TWI_GPIO_MAP =
{
{AVR32_TWI_SDA_0_0_PIN, AVR32_TWI_SDA_0_0_FUNCTION},
{AVR32_TWI_SCL_0_0_PIN, AVR32_TWI_SCL_0_0_FUNCTION}
};
twi_options_t options;
twi_package_t packet;
int status;
// Switch to oscillator 0
pm_switch_to_osc0(&AVR32_PM, FOSC0, OSC0_STARTUP);
// Init debug serial line
init_dbg_rs232(FOSC0);
// Display a header to user
print_dbg("\x0C\r\nTWI Example\r\nMaster!\r\n");
// TWI gpio pins configuration
gpio_enable_module(TWI_GPIO_MAP, sizeof(TWI_GPIO_MAP) / sizeof(TWI_GPIO_MAP[0]));
// options settings
options.pba_hz = FOSC0;
options.speed = TWI_SPEED;
options.chip = EEPROM_ADDRESS;
// initialize TWI driver with options
status = twi_master_init(&AVR32_TWI, &options);
// check init result
if (status == TWI_SUCCESS)
{
// display test result to user
print_dbg("Probe test:\tPASS\r\n");
}
else
{
// display test result to user
print_dbg("Probe test:\tFAIL\r\n");
}
// TWI chip address to communicate with
packet.chip = EEPROM_ADDRESS;
// TWI address/commands to issue to the other chip (node)
packet.addr = VIRTUALMEM_ADDR_START;
// Length of the TWI data address segment (1-3 bytes)
packet.addr_length = EEPROM_ADDR_LGT;
// Where to find the data to be written
packet.buffer = (void*) test_pattern;
// How many bytes do we want to write
packet.length = PATTERN_TEST_LENGTH;
// perform a write access
status = twi_master_write(&AVR32_TWI, &packet);
// check write result
if (status == TWI_SUCCESS)
{
// display test result to user
print_dbg("Write test:\tPASS\r\n");
}
else
{
// display test result to user
print_dbg("Write test:\tFAIL\r\n");
}
while(1);
}
Aunque tengo varias dudas...Por ejemplo, donde yo he puesto:
#define EEPROM_ADDRESS 0xE0 // EEPROM's TWI address
#define EEPROM_ADDR_LGT 1 // Address length of the EEPROM memory
#define VIRTUALMEM_ADDR_START 0xE0 // Address of the virtual mem in the EEPROM
#define TWI_SPEED 9600 // Speed of TWI
La gente de Atmel pone:
#define EEPROM_ADDRESS 0x50 // EEPROM's TWI address
#define EEPROM_ADDR_LGT 3 // Address length of the EEPROM memory
#define VIRTUALMEM_ADDR_START 0x123456 // Address of the virtual mem in the EEPROM
#define TWI_SPEED 50000 // Speed of TWI
Yo había pensado en poner 0xE0 en vez de 0x50, por las razones obvias de que la direccion de memoria del SRF02 es esa...pero nose hasta que punto es correcto. Otra cosa que ni idea, es para que sirve el VIRTUALMEM_ADDR_START. No entiendo el concepto de Memoria Virtual en la EEPROM...y bueno, por último lo de EEPROM_ADDR_LGT pues he puesto 1 simplemente, porque la memoria es 1 byte, 0xE0.
Este tipo de datos se definen para más tarde, crear un "paquete" (( twi_package_t packet; )) que será el transmitido a través del TWI y del que se me plantean más dudas:
1. packet.chip (TWI chip address to communicate with) -> ¿Esto debe ser la dirección 0xE0?
2. packet.addr (TWI address/commands to issue to the other chip (node)) -> Aquí ni idea, por defecto le ponen el VIRTUALMEM... definido antes.
Estos datos, los mete dentro del paquete y los envia mediante el comando "twi_master_write(&AVR32_TWI, &packet);" pero al parecer nunca llegan a destino, pues siempre pone FAIL.
Tendré que pensar como seguir...quizás probar primero a leer desde el TWI los propios registros, aunque no tengan nada, pero a saber que pasa aquí.
Muchas gracias por tu ayuda!