Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <xc.h>
- #include "Libraries/Global/conf.h"
- #include "Libraries/I2C/I2C.h"
- #include "Libraries/Relais/Relais.h"
- struct Relais _relais;
- char data = 0;
- char data2 = 0;
- void System_INIT();
- void OSC_INIT();
- void Pinning_INIT();
- /*
- *
- * Main Function
- *
- */
- void main(void) {
- System_INIT(); //Call the System Initialisation function
- while(1)
- {
- Relais_Turn_ON_OFF(_relais.value); //Call Relais function, turns on/off relais
- _data = Relais_Validate_State();
- }
- return;
- }
- /*
- * Name: ISR
- * Function: Interrupt function, call all other interupt functions
- * Input: None
- * Output: None
- */
- void __interrupt() ISR()
- {
- data = I2C_Slave_Read(&data2); //call the interrupt for I2C bus
- __delay_us(1); //dummy delay
- if (data2) //check if received info is data or address
- {
- _relais.value = data; //transfer data to relais struct
- }
- }
- /*
- *
- * Init Functions
- *
- */
- void System_INIT()
- {
- OSC_INIT(); //Init clock
- Pinning_INIT(); //init Pinning
- Relais_INIT(); //init relais pinning
- _relais.value = 0xff; //initialize relais values (should be 0, but test board has inverted logic)
- I2C_Init(I2C_SLAVE, 0x2A); //Init I2C
- }
- void OSC_INIT()
- {
- OSCCON1bits.NOSC = 0b110; // = HFINTOSC
- OSCCON1bits.NDIV = 0b0000; // Clock divider = 1
- OSCFRQbits.HFFRQ = 0b1000; // HFINTOSC Frequency selection bits: 64 Nominal Freq (MHz)
- OSCENbits.HFOEN = 0b1; // HFINTOSC is explicitly enabled, operating as specified by OSCFRQ
- }
- void Pinning_INIT()
- {
- _GPIO_LOW(IO_LED); //turn test led low
- _GPIO_OUT(IO_LED); //enable output for led
- _GPIO_DIGITAL(IO_LED); //set output to digital
- }
- void I2C_Init(uchar master, uchar clock_speed_addres)
- {
- PPSLOCK = 0x55;
- PPSLOCK = 0xAA;
- PPSLOCKbits.PPSLOCKED = 0;
- SSP1CLKPPS = 0x13; // MSSP1:SCL1->RC3;
- SSP1DATPPS = 0x14; // MSSP1:SDA1->RC4;
- RC3PPS = 0x0F; // RC3->MSSP1:SCL1;
- RC4PPS = 0x10; // RC4->MSSP1:SDA1;
- PPSLOCK = 0x55;
- PPSLOCK = 0xAA;
- PPSLOCKbits.PPSLOCKED = 1;
- _GPIO_DIGITAL(IO_SCL); //Make digital
- _GPIO_DIGITAL(IO_SDA);
- _GPIO_LOW(IO_SCL); // make low
- _GPIO_LOW(IO_SDA);
- _GPIO_IN(IO_SCL); //Make tristate
- _GPIO_IN(IO_SDA);
- TRISCbits.TRISC3 = 0b1;
- TRISCbits.TRISC4 = 0b1;
- // Analog Select Register
- // 1 Digital Input buffers are disabled
- // 0 ST and TTL input buffers are enabled
- ANSELCbits.ANSELC3 = 0b0;
- ANSELCbits.ANSELC4 = 0b0;
- // Input Level Control Register
- // 1 ST input used for port reads and interrupt-on-change
- // 0 TTL input used for port reads and interrupt-on-change
- INLVLCbits.INLVLC3 = 0b1;
- INLVLCbits.INLVLC4 = 0b1;
- // Slew Rate Control
- // 1 Port pin slew rate is limited
- // 0 Port pin slew at maximum rate
- SLRCONCbits.SLRC3 = 0b0;
- SLRCONCbits.SLRC4 = 0b0;
- #ifdef testing
- WPUCbits.WPUC3 = 0b1;
- WPUCbits.WPUC4 = 0b1;
- #endif
- if (master)
- {
- SSP1CON1 = 0b00101000; //SSP Module as Master
- SSP1CON2 = 0;
- SSP1ADD = (_XTAL_FREQ/(4*clock_speed_addres))-1; //Setting Clock Speed
- SSP1STAT = 0;
- }
- else
- {
- SSP1STAT = 0x80;
- SSP1ADD = clock_speed_addres<<1; //Setting address
- SSP1CON1 = 0x36; //As a slave device
- SSP1CON2 = 0x01;
- SSP1CON3 = 0b00000110;
- GIE = 1; //Global interrupt enable
- PEIE = 1; //Peripheral interrupt enable
- SSP1IF = 0; //Clear interrupt flag
- SSP1IE = 1; //Synchronous serial port interrupt enable
- SSP1MSK = 0xFF;
- }
- }
- void I2C_Master_Wait()
- {
- while ((SSP1STAT & 0x04) || (SSP1CON2 & 0x1F)); //Transmit is in progress
- }
- void I2C_Master_Start()
- {
- I2C_Master_Wait();
- SEN1 = 1; //Initiate start condition
- }
- void I2C_Master_RepeatedStart()
- {
- I2C_Master_Wait();
- RSEN1 = 1; //Initiate repeated start condition
- }
- void I2C_Master_Stop()
- {
- I2C_Master_Wait();
- PEN1 = 1; //Initiate stop condition
- }
- char I2C_Master_Write(unsigned data_byte)
- {
- I2C_Master_Wait();
- SSP1BUF = data_byte; //Write data to SSPBUF
- I2C_Master_Wait();
- return ACKSTAT1;
- }
- uchar I2C_Master_Read(uchar ACK)
- {
- unsigned short retVal;
- I2C_Master_Wait();
- RCEN1 = 1;
- I2C_Master_Wait();
- retVal = SSP1BUF; //Read data from SSPBUF
- I2C_Master_Wait();
- ACKDT1 = (ACK)?0:1; //Acknowledge bit
- ACKEN1 = 1; //Acknowledge sequence
- return retVal;
- }
- void I2C_Master_Write_Byte(char address, char data)
- {
- I2C_Master_Start();
- I2C_Master_Write(address);
- I2C_Master_Write(data);
- I2C_Master_Stop();
- }
- char I2C_Slave_Read(char *data)
- {
- GIE = 0;
- char retVal = 0;
- if(SSP1IF == 1)
- {
- //CKP1 = 0;
- data[0]=0;
- if ((SSPOV1) || (WCOL1)) //If overflow or collision
- {
- retVal = SSP1BUF; // Read the previous value to clear the buffer
- SSPOV1 = 0; // Clear the overflow flag
- WCOL1 = 0; // Clear the collision bit
- CKP1 = 1;
- }
- if(!SSP1STATbits.D_nA && !SSP1STATbits.R_nW) //If last byte was Address + Write
- {
- retVal = SSP1BUF;
- CKP1 = 1;
- while(BF1);
- //while(!BF1);
- //PORTD = ~SSP1BUF;
- //CKP1 = 1;
- }
- else if(SSP1STATbits.D_nA && !SSP1STATbits.R_nW)
- {
- retVal = ~SSP1BUF;
- CKP1 = 1;
- data[0] = 1;
- }
- else if(!SSP1STATbits.D_nA && SSP1STATbits.R_nW) //If last byte was Address + Read
- {
- SSP1IF = 0;
- retVal = SSP1BUF;
- while(BF1);
- // BF1 = 0;
- SSP1BUF = _data ;
- CKP1 = 1;
- //while(!SSP1IF);
- SSP1IF = 0;
- //while(SSP1STATbits.BF);
- SSP1IF = 0;
- if(ACKSTAT1)
- {
- SSP1BUF = _data ;
- CKP1 = 1;
- //while(!SSP1IF);
- SSP1IF = 0;
- }
- CKP1 = 1;
- SSP1IF = 0;
- }
- SSP1IF = 0;
- }
- SSP1IF =0;
- GIE = 1;
- return retVal;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement