/* Arlotto 2004 : Routines d'accès au C-BUS */ #include #include "biosdem.h" #include "cbus.h" void CBUS_init(void) { CBUS_CLK = 0 ; CBUS_CMD = 0 ; CBUS_TRIS_CSN = 0 ; CBUS_CSN = 1 ; CBUS_TRIS_CLK = 0 ; CBUS_TRIS_CMD = 0 ; CBUS_TRIS_IRQN = 1 ; CBUS_TRIS_REPLY = 1 ; } unsigned char CBUS_PutByte(unsigned char byte) { unsigned char m = 0x80 ; // MSB first CBUS_CSN = 0 ; DelayUs(CBUS_T_NXT/2); while(m!=0) { CBUS_CMD =((byte & m)!=0)?1:0 ; // on sort la valeur m = m >> 1 ; CBUS_CLK = 0 ; // on génère un cycle CLK DelayUs(CBUS_T_CLK/2); CBUS_CLK = 1 ; // le transfert a lieu sur ^ DelayUs(CBUS_T_CLK/2); } CBUS_CLK = 0 ; DelayUs(CBUS_T_LAST_CLK_CSN-(CBUS_T_CLK/2)); CBUS_CSN = 1 ; return byte ; } void CBUS_SendCommand(unsigned char address, unsigned char data) { unsigned char m = 0x80 ; // MSB first CBUS_CSN = 0 ; DelayUs(CBUS_T_NXT/2); while(m!=0) // envoie l'adresse { CBUS_CMD =((address & m)!=0)?1:0 ; // on sort la valeur m = m >> 1 ; CBUS_CLK = 0 ; // on génère un cycle CLK DelayUs(CBUS_T_CLK/2); CBUS_CLK = 1 ; // le transfert a lieu sur ^ DelayUs(CBUS_T_CLK/2); } CBUS_CLK = 0 ; DelayUs(CBUS_T_NXT-(CBUS_T_CLK/2)); // on attend avec le CS à 0 m=0x80; while(m!=0) // puis envoie data { CBUS_CMD =((data & m)!=0)?1:0 ; // on sort la valeur m = m >> 1 ; CBUS_CLK = 0 ; // on génère un cycle CLK DelayUs(CBUS_T_CLK/2); CBUS_CLK = 1 ; // le transfert a lieu sur ^ DelayUs(CBUS_T_CLK/2); } CBUS_CLK = 0 ; DelayUs(CBUS_T_LAST_CLK_CSN-(CBUS_T_CLK/2)); CBUS_CSN = 1 ; } void CBUS_SendCommand2Bytes(unsigned char address, unsigned char dataMSB,unsigned char dataLSB) { unsigned char m = 0x80 ; // MSB first CBUS_CSN = 0 ; DelayUs(CBUS_T_NXT/2); while(m!=0) // envoie l'adresse { CBUS_CMD =((address & m)!=0)?1:0 ; // on sort la valeur m = m >> 1 ; CBUS_CLK = 0 ; // on génère un cycle CLK DelayUs(CBUS_T_CLK/2); CBUS_CLK = 1 ; // le transfert a lieu sur ^ DelayUs(CBUS_T_CLK/2); } CBUS_CLK = 0 ; DelayUs(CBUS_T_NXT-(CBUS_T_CLK/2)); // on attend avec le CS à 0 m=0x80; while(m!=0) // puis envoie dataMSB { CBUS_CMD =((dataMSB & m)!=0)?1:0 ; // on sort la valeur m = m >> 1 ; CBUS_CLK = 0 ; // on génère un cycle CLK DelayUs(CBUS_T_CLK/2); CBUS_CLK = 1 ; // le transfert a lieu sur ^ DelayUs(CBUS_T_CLK/2); } CBUS_CLK = 0 ; DelayUs(CBUS_T_NXT-(CBUS_T_CLK/2)); // on attend avec le CS à 0 m=0x80; while(m!=0) // puis envoie dataLSB { CBUS_CMD =((dataLSB & m)!=0)?1:0 ; // on sort la valeur m = m >> 1 ; CBUS_CLK = 0 ; // on génère un cycle CLK DelayUs(CBUS_T_CLK/2); CBUS_CLK = 1 ; // le transfert a lieu sur ^ DelayUs(CBUS_T_CLK/2); } CBUS_CLK = 0 ; DelayUs(CBUS_T_LAST_CLK_CSN-(CBUS_T_CLK/2)); CBUS_CSN = 1 ; } void CBUS_SendCommandWord(unsigned char address, unsigned int dataWord ) { unsigned char dataMSB,dataLSB; dataMSB = (unsigned char)((dataWord & 0xFF00)>>8); dataLSB= (unsigned char)(dataWord & 0x00FF); CBUS_SendCommand2Bytes(address, dataMSB, dataLSB); } unsigned char CBUS_GetByte( unsigned char address ) { unsigned char m = 0x80 ; // MSB first unsigned char Byte = 0 ; CBUS_CSN = 0 ; DelayUs(CBUS_T_NXT/2); while(m!=0) // envoie l'adresse { CBUS_CMD =((address & m)!=0)?1:0 ; // on sort la valeur m = m >> 1 ; CBUS_CLK = 0 ; // on génère un cycle CLK DelayUs(CBUS_T_CLK/2); CBUS_CLK = 1 ; // le transfert a lieu sur ^ DelayUs(CBUS_T_CLK/2); } CBUS_CLK = 0 ; DelayUs(CBUS_T_NXT-(CBUS_T_CLK/2)); // on attend avec le CS à 0 m=0x80; while(m!=0) // on lit les 8 bits MSB first { CBUS_CLK = 0 ; // on génère un cycle CLK DelayUs(CBUS_T_CLK/2); CBUS_CLK = 1 ; // la lecture est possible DelayUs(CBUS_T_CLK/2); Byte += (CBUS_REPLY==1)?m:0; m = m >> 1; } CBUS_CLK = 0 ; DelayUs(CBUS_T_LAST_CLK_CSN-(CBUS_T_CLK/2)); CBUS_CSN = 1 ; return Byte ; } unsigned int CBUS_GetWord( unsigned char address ) { unsigned char m = 0x80 ; // MSB first unsigned char LSByte = 0 , MSByte = 0 ; CBUS_CSN = 0 ; DelayUs(CBUS_T_NXT/2); while(m!=0) // envoie l'adresse { CBUS_CMD =((address & m)!=0)?1:0 ; // on sort la valeur m = m >> 1 ; CBUS_CLK = 0 ; // on génère un cycle CLK DelayUs(CBUS_T_CLK/2); CBUS_CLK = 1 ; // le transfert a lieu sur ^ DelayUs(CBUS_T_CLK/2); } CBUS_CLK = 0 ; DelayUs(CBUS_T_NXT-(CBUS_T_CLK/2)); // on attend avec le CS à 0 m=0x80; while(m!=0) // on lit les 8 bits MSB first { CBUS_CLK = 0 ; // on génère un cycle CLK DelayUs(CBUS_T_CLK/2); CBUS_CLK = 1 ; // la lecture est possible DelayUs(CBUS_T_CLK/2); MSByte += (CBUS_REPLY==1)?m:0; m = m >> 1; } CBUS_CLK = 0 ; DelayUs(CBUS_T_NXT-(CBUS_T_CLK/2)); m=0x80; while(m!=0) // on lit les 8 bits MSB first { CBUS_CLK = 0 ; // on génère un cycle CLK DelayUs(CBUS_T_CLK/2); CBUS_CLK = 1 ; // la lecture est possible DelayUs(CBUS_T_CLK/2); LSByte += (CBUS_REPLY==1)?m:0; m = m >> 1; } CBUS_CLK = 0 ; DelayUs(CBUS_T_LAST_CLK_CSN-(CBUS_T_CLK/2)); CBUS_CSN = 1 ; return (unsigned int)(MSByte<<8) + (unsigned int)LSByte ; }