jueves, 29 de diciembre de 2016

PRACTICA # 8 EEPROM (I2C)

OBJETIVO:

Haremos uso de la interface IICA0 con la que cuenta el MCU R5F104PJAFB de la tarjeta de evaluación YRDKRL78G14. Escribiremos una trama de 128 datos en la memoria EEPROM a 100 Khz y los volveremos a leer verificándolos en el debug en un array de datos.
  •  Inicializaremos el módulo IICA0 

  •  Se crearán rutinas de lectura y escritura I2C

  •  Se creará interrupción I2C

  •  Se implementará la API EEPROM para manejo de funciones de lectura y escritura.

DESARROLLO:
  •  Del manual Renesas RL78G14 RDK User's Manual ubicamos la dirección de la EEPROM
  •  Del YRDKRL78G14 schematic ubicamos la EEPROM:


PASOS:
  •  Creación de un proyecto:
1.- Abrir el software e2studio
2.- New/ C Project



  •  Configurar proyecto:
1.- Clic derecho en el proyecto generado y seleccionar Properties



2.- Seleccionar C/C++ Build / Settings / Linker / Device y establecer los siguientes parámetros:
OCD = 85
Option Byte = efffe8
Palomear: Use range of debug monitor area. Nota: No establecer ningún valor solo dejarlo en blanco.
Apply y después OK.


3.- Las rutinas de lectura y escritura de la EEPROM se encuentran en el archivo EEPROM.c

void EEPROM_Write(unsigned long addr, uint16_t lenth ,unsigned char *pdata)
{
    uint8_t send[130];
    I2C_Request r;
    uint16_t len = 2;
    unsigned char j;

    send[0] = addr & 0xFF00;
    send[1] = addr & 0x00FF;

    for(j=0; j<lenth; j++)
    {
           send[len] = (uint8_t)*pdata;
           len++;
           pdata++;
    }

    r.iAddr = EEPROM_DEVICE_ADDRESS>>1;
    r.iSpeed = 100; /* kHz */
    r.iWriteData = send;
    r.iWriteLength = len;
    r.iReadData = 0;
    r.iReadLength = 0;

    I2C_Start();
    I2C_Write(&r, 0);
    delay_ms(10);
    G_100usTimer=0;
    G_msTimer = 0;
    R_IT_Start();
    while (I2C_IsBusy() && G_msTimer < 20)
            {
                        __nop();
            }
    R_IT_Stop();
}

int16_t EEPROM_Read(uint16_t addr, uint8_t *pdata, uint16_t r_lenth)
{
    uint8_t target_address[2];
    I2C_Request r;
    int16_t result = 0;

    target_address[0] = addr & 0xFF00;
    target_address[1] = addr & 0x00FF;

    r.iAddr = EEPROM_DEVICE_ADDRESS >> 1;
    r.iSpeed = 100;
    r.iWriteData = target_address;
    r.iWriteLength = 2;
    r.iReadData = pdata;
    r.iReadLength = r_lenth;
    I2C_Write(&r, 0);
    delay_ms(10);
    G_100usTimer=0;
    G_msTimer = 0;
    R_IT_Start();
    while (I2C_IsBusy() && G_msTimer < 20)
            {
                       __nop();
            }
    R_IT_Stop();
   I2C_Read(&r, 0);
   delay_ms(10);
   G_100usTimer=0;
   G_msTimer = 0;
   R_IT_Start();
   while (I2C_IsBusy() && G_msTimer < 20)
   {
           __nop();
   }
   R_IT_Stop();
   result = 1;

    return result;
}


4.- La API I2C se encuentra en el archivo I2C.c cuyas rutinas son:
  •           void I2C_Start(void);
  •           void I2C_Stop(void);
  •           void I2C_Read(I2C_Request *iRequest, void(*callback)(void));
  •           void I2C_Write(I2C_Request *iRequest, void(*callback)(void));
  •           _Bool I2C_IsBusy(void);


  • Agregar código, compilar y debug: 
1.- Bajar el código de:
--> Practica #8

2.- Compilar con el icono del martillo, debug con el icono del insecto y correr software:


RESULTADO:






No hay comentarios.:

Publicar un comentario