XC8 pic16f876a I2C Slave
Как реализовать код для использования пика в подчиненном режиме? Я пришел к вам, потому что я не нашел в Интернете удовлетворительного ответа на мой поиск.
Я опытный принцип поезда на заказы PIC16FXXX. Цель состоит в том, чтобы разгрузить электронную карту менее актуальных задач.
Для этого я бы использовал I2C. До этого я просто привел компоненты, уже установленные. И теперь у меня есть свой компонент.
Вы можете сказать мне, что вся эта чушь бесполезна, но важно знать, куда вы идете.
Поэтому я установил набор инструментов между моим ПК и моим изображением с помощью MPLAB и надежного компилятора XC8 Hi-Tech.
Я нашел хороший пример кода, и кажется, что отправка данных компоненту завершена. Я не смог получить контроль над моим PIC.
Это то, что я написал в C (компиляция в порядке): 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
}
}
Пример связи: Стартовый бит 11110000 -> 1111000 (код) + 0 (запись) ACK (ведомый) 00000001 -> светодиод 7 = 0/6 = 0 Led / Led 5 = 0/4 = 0 Led / Led 3 = 0/2 = 0 светодиод / светодиод 1 = 0/0 = 1 светодиодный стоповый бит
подождите Мастер
Стартовый бит 11110000 -> 1111000 (код) + 0 (запись) ACK (ведомый) 00000000 -> светодиод 7 = 0/6 = 0 Led / Led 5 = 0/4 = 0 Led / Led 3 = 0/2 = 0 LED / Светодиод 1 = 0/0 = 0 светодиодный стоповый бит
подождите мастер петли
Вот вопрос, который я задаю сейчас. Как реализовать код для использования пика в подчиненном режиме?
Большое спасибо за Вашу помощь.