我来找您的原因是,我在网络上没有找到令人满意的搜索答案,因此来找您。

我对外包PIC16FXXX的订单具有丰富的培训原则。 目的是卸载不太紧急任务的电子地图。

为此,我将使用I2C。 在那之前,我只是驱动已经建立的组件。 现在,我有了自己的组件。

您可能对我说,所有的废话都是无用的,但了解您要去的地方很重要。

因此,我使用MPLAB和可靠的编译器XC8 Hi-Tech在PC和图片之间建立了一个工具链。

我找到了一个很好的代码示例,似乎已经可以将数据发送到组件了。 我无法在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-> LED 7 = 0/6 = 0 Led / Led 5 = 0/4 = 0 Led / Led 3 = 0 / 2 = 0 LED / LED 1 = 0/0 = 1 Led停止位

等师父

起始位11110000-> 1111000(代码)+ 0(写入)ACK(从设备)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停止位

等待主循环

这是我现在提出的问题。 如何实现在从机模式下使用峰值的代码?

非常感谢您的帮助。

  ask by translate from so

本文未有回复,本站智能推荐:

1回复

IC2从机未响应XC8

大家好,我已经连续72个小时在研究这个问题,但我找不到错误,我正在研究PIC16F1719,我正在尝试设置3个外设ADC,I2C协议和USART以与BT通信。但是ADC很容易,但是尽管我已经多次检查了代码,但我在I2C上却经历了一段艰难的时光,由于某种原因,当我得到ACK时,一切似乎都很好,但是
2回复

从PIC18中的I2C从协议中的变量写入SSPBUF

我正在为PIC18F25K80编写I2C从程序例程,但我遇到了一个奇怪的问题。 这是我的例程: 如果我在SSPBUF上设置恒定值,它就像一个魅力。 例如,如果您这样做: 我在主机上得到了两个字节。 我什至可以看到在示波器上传输的字节的波形。 很好玩! 但是当我尝
1回复

为Devantech数字罗盘设置i2c从站地址

我正在尝试与在此处找到的Devantech数字罗盘进行交互- http://www.acroname.com/robotics/parts/R117-COMPASS.html 我正在使用i2c-usb转换器将其插入笔记本电脑- http://www.robot-electron
2回复

STM32F4上的I2C从接收器

我尝试在stm32f4上实现i2c从属接收器中断服务例程。 这是我的聪明代码。 } 中断被调用,并进入I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED情况。 SCL现在很低。 参考手册说,如果我清除地址标志,时钟将继续并发送数据(第579页-从
1回复

stm32l152作为I2C从设备未确认地址

我正在使用两只stm32l152发现野猪。 一个配置为主机,另一个配置为从机。 我对两个都启用了确认,但是当主机发送地址时,从机不会在9个时钟脉冲时发送ack位。 端口设置为备用功能4并开漏。 我正在使用外部4.7k上拉电阻至3.3V。 我已经多次检查了所有寄存器,但不知道为什么从机无
1回复

I2C从发送器NACK(又名可变长度回复)

发送到主机时,I2C从机是否允许NACK? 从规范(2.1)看来,从站无法在发送时实际向主机发送NACK,即从从站向主机发送数据。 我已经搜寻了网,但在这里找不到任何帮助。 为什么? 我正在AVR Atmega8中实现I2C主设备。 我想介绍所有用例。 我有一个用户已经注意到
1回复

Aardvark I2C奴隶问题

我遵循此链接中的步骤: 在64位Windows上将Aardvark与Python结合使用 我尝试使用命令提示符(使用aai2c_eeprom.py从EEPROM写入和读取)来读写字节,即尝试通过键入以下内容进行读取: C:/Python27/python.exe aai2c_eepro
2回复

PIC16F887 PORT无法与XC8 C编译器一起使用

我是很新,PIC编程,我试图用C(与Microchip的免费XC8编译MPLABX )做一个简单的“输入到输出”节目。 我遇到的问题是,在C语言中进行编程时,RA2,RA3和RA5输入引脚不起作用。 这可能不是硬件问题,因为在梯形图中编程时,这些引脚可以正常工作。 我已经在互联网上搜
1回复

带有XC8 v1.43的PIC16F1717,用于按键的变量

我有一个4x3矩阵键盘连接到PIC16F1717的端口B(RB1-RB7)。 我通过依次将每一行设置为高并读取列值来扫描键盘按键。 可以通过匹配行和列来对按下的键进行解码。 我的弹跳动作稍有延迟: 两个变量key和keyCount分别跟踪已按下的键和按下的键数。 当按下4个键时,
2回复

忽略WDTE的MPLAB xc8 pic16f688编译指示

当使用#pragma CONFIG = WDTE OFF时,我收到一条消息,“ WDTE设置为ON,我是否要更改它?” 我回答是。 我关心的是其他配置语句是否被忽略? 我不知道 新话题。 试图用PIC16f688使LED闪烁。 我得到它的工作,有点。 我确保#pragma语句位