Autor Tema: dsPIC33FJ con PCF8583T via I2C  (Leído 2151 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Tiri

  • PIC10
  • *
  • Mensajes: 6
dsPIC33FJ con PCF8583T via I2C
« en: 29 de Marzo de 2011, 12:38:45 »
Buenas,

Primero de todo tengo que decir que soy novato en la programacion del PIC, y tambien decir lo muy bien que me ha ido este foro para recolectar informacion diversa.
Este es mi primer mensaje, y como no, mi duda es mas bien conceptual, ya que de codigo por internet corre muchisima cosa, y se que el codigo que implemento funciona, pero no lo entiendo, asi que espero que alguien me lo pueda explicar de una forma para "tontos" mejor posible.

Al tema: quiero implementar un PCF8583T con un dsPIC33FJ, y se tiene que hacer con el bus I2C. El codigo es sacado de microchip, para leer una EEPROM, pero con unos retoques se implementa al PCF8583T. Tengo mi archivo .h que es el siguiente:

#ifndef __I2CEMEM_H__
#define __I2CEMEM_H__


#define MAX_RETRY    1000
#define ONE_BYTE     1
#define TWO_BYTE     2

// EEPROM ADDRESS SIZE
#define ADDRWIDTH   ONE_BYTE     
 
// EEPROM DRIVER COMMAND DEFINITION
#define I2C_IDLE        0 
#define I2C_WRITE        1     
#define I2C_READ         2   
#define I2C_ERR        0xFFFF
#define   I2C_STOP      15

// EEPROM DATA OBJECT
typedef struct {
        char *buff; // unsigned int *buff;
        unsigned int n;       
        unsigned int addr;       
        unsigned int csel;           
}I2CEMEM_DATA;

// EEPROM DRIVER OBJECT
typedef struct {
        unsigned int   cmd;
      I2CEMEM_DATA   *oData;          
        void (*init)(void *);                   
        void (*tick)(void *);
        }I2CEMEM_DRV;
   
#define I2CSEMEM_DRV_DEFAULTS { 0,\
        (I2CEMEM_DATA *)0,\
        (void (*)(void *))I2CEMEMinit,\
        (void (*)(void *))I2CEMEMdrv} 
       

void I2CEMEMinit(I2CEMEM_DRV *);
void I2CEMEMdrv(I2CEMEM_DRV *);


#endif

Luego en el .c hace primero la inicializacion de los parametros del I2C (I2C1CONbits, etc etc) y ya luego entramos en un switch case donde el primero hace el START y el segundo se por leer el datasheet que tiene que enviar la direccion del slave i la direccion de la palabra donde empezara a escrivir o leer, pero no lo entiendo.

La sentencia es la siguiente:

I2C1TRN=(0x00A0)|(((i2cMem->oData->csel)&0x7)<<1) | (((i2cMem->oData->addr)&0x0100)>>7);

Asi que espero que alguien me pueda ayudar a entenderlo.

Muchas gracias

PD: En mi opinion deberia haber un sitio en este foro orientado tan solo para conceptos, es decir teoria a punta pala, ya que cuando entiendes como va el juego, no hay quien te pare. Tan solo es una opinion  :)


 

anything