0

How to implement the code to use the peak in slave mode?I come to you because I have not found on the web a satisfactory answer to my search.

I am an experienced train principle on orders outsourced PIC16FXXX. The goal is to unload the electronic map of the less urgent tasks.

To do this, I would use the I2C. Until then, I merely driven components already established. And now, I have my own component.

You might say to me that all the crap is useless but it is important to know where you are going.

So I set up a toolchain cross between my PC and my pic with MPLAB and reliable compiler XC8 Hi-Tech.

I Locate a good example of code and it seems complete to send data to a component. I have not been able to receive control on my PIC.

This is what I wrote in C (the compilation is ok): i2c.h

 #define I2C_WRITE 0
#define I2C_READ 1

//Initialise MSSP port
void i2c_Init(void) {
    //Initialise I2C MSSP
    //Master 100KHz
    TRISA1 = 1; //Set SCL et SDA pins as inputs
    TRISA2 = 1;

    SSPCON = 0b00101000;    //I2C enabled Master mode
    SSPCON2 = 0x00;
    //I2C Master mode, clock = FOSC/(4 * (SSPADD + 1))
    SSPADD = 39;    //100KHz @ 16MHz Fosc

    SSPSTAT = 0b11000000;   //Slew rate disabled
}

//i2c_Wait - Wait for I2C transfet to finish
void i2c_Wait(void) {
    while((SSP1CON2 & 0x1F) || (SSPSTAT & 0x004));
}

//i2c_Start - Start I2C communication
void i2c_Start(void) {
    i2c_Wait();
    SEN = 1;
}

//i2c_Restart - Re-Start I2C communication
void i2c_Restart(void) {
    i2c_Wait();
    RSEN = 1;
}

//i2c_Stop - Stop I2C communication
void i2c_Stop(void) {
    i2c_Wait();
    PEN = 1;
}

//i2c_Write - Sends on byte of data
void i2c_Write(unsigned char data) {
    i2c_Wait();
    SSPBUF = data;
}

//i2c_Adress - Send Slave Adress and Read/Write mode
//mode is either I2C_WRITE or I2C_READ
void i2c_Adress(unsigned char adress, unsigned char mode) {
    unsigned char l_adress;
    l_adress = adress << 1;
    l_adress += mode;
    i2c_Wait();
    SSPBUF = l_adress;
}

//i2c_Read - Reads a byte from Slave device
unigned char i2c_Read(unsigned char ack) {
    //Read data from slave
    //ack should be 1 if there is going to be more data read
    //ack should be 0 if the last byte of data read
    unsigned char i2cReadData;

    i2c_Wait();
    RCEN = 1;
    i2c_Wait();
    i2cReadData = SSPBUF;
    i2c_Wait();
    if(ack) ACKDT = 0;  //Ack
    else    ACKDT = 1;  //NAck
    ACKEN = 1;

    return (i2cReadData);
}

main.c

//Includes
#include <xc.h>
#include <pic16f876a.h>
#include "i2c.h"

//Variables

//Interruptions

//Conf
#pragma config WDTE=OFF, FOSC=XT
#define _XTAL_FREQ 20000000

//Programme principal
void main(void) {

    //Init
    //Port A (out) -> led

    //Wait Num 11110000
    //ACK
    //Wait Write fo exemple 00000001 (led ON)
    //ACK
    //Wait STOP

    //Loop
    while(1) {

        //if Write (00000001)
            //Led ON
        //else
            //Led OFF
    }
}

Example of communication: Start bit 11110000 -> 1111000 (code) + 0 (write) ACK (slave) 00000001 -> LED 7 = 0/6 = 0 Led / Led 5 = 0/4 = 0 Led / Led 3 = 0/2 = 0 LED / LED 1 = 0/0 = 1 Led Stop bit

wait Master

Start bit 11110000 -> 1111000 (code) + 0 (write) ACK (slave) 00000000 -> LED 7 = 0/6 = 0 Led / Led 5 = 0/4 = 0 Led / Led 3 = 0/2 = 0 LED / LED 1 = 0/0 = 0 Led Stop bit

wait master Loop

Here are question I pose now. How to implement the code to use the peak in slave mode?

Thank you very much for your help.

  • What is your specific question ? – Paul R Apr 20 '14 at 15:14
  • How to make the peak can launch its ACK if it is called by its number? How then run receiving orders? –  Apr 20 '14 at 16:01
  • OK - you might want to edit the info from your comment into your question as otherwise it's not very clear what specific problem you are trying to solve. – Paul R Apr 20 '14 at 16:04
  • Ok, I add that I put in comment :) –  Apr 20 '14 at 16:14

0 Answers0