I2C-Schnittstelle auf Tiva

Auf eine Tiva (Texas Instruments Cortex-M4F-ARM) TM4C129XNCZAD ich habe ein problem mit I2C-Schnittstelle. Ich habe aktiviert sowohl ein master auf dem I2C-Modul 4-thru-Anschluss K und einem slave auf dem I2C-Modul 6-thru-Anschluss B. ich habe beide miteinander verbunden I2C-Module. Mit Texas Instruments Treiber-Bibliothek, die ich versuchte, senden von 1 byte mit I2C_MASTER_CMD_SINGLE_SEND Befehl. Ich verbringe viel Zeit damit es funktioniert, aber SCK-Linie hält Niedrigen logischen Pegel. Ich folgte genau TivaWare™ Peripheral Driver Library USER ' S GUIDE, aber die Kommunikation funktioniert nicht. Hat jemand etwas Erfahrung damit?

Da ist mein code:

#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_i2c.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/gpio.h"
#include "driverlib/i2c.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.h"
#include "inc/tm4c129xnczad.h"

#define SLAVE_ADDRESS 0x3C

void  delay  (void)
{
    volatile uint32_t ui32Loop; 
    for(ui32Loop = 0; ui32Loop < 200000; ui32Loop++);
}

volatile  uint32_t  result;

int  main  (void)
{
    SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ); 
    //
    //Enable the GPIO port that is used for the on-board LED.
    //
    SYSCTL_RCGCGPIO_R = SYSCTL_RCGCGPIO_R3 | SYSCTL_RCGCGPIO_R9 | SYSCTL_RCGCGPIO_R1;
    //
    //Do a dummy read to insert a few cycles after enabling the peripheral.
    //
    result = SYSCTL_RCGCGPIO_R;
    //
    //Enable the GPIO pin for the LED (PD3).  Set the direction as output, and
    //enable the GPIO pin for digital function.
    //
    GPIO_PORTD_AHB_DIR_R = 0x8;
    GPIO_PORTD_AHB_DEN_R = 0x8;
    GPIO_PORTK_DEN_R = 0xC0;        //Enable Port K for I2C module 4

    GPIO_PORTB_AHB_DEN_R = 0xC0;    //Enable Port B for I2C module 6

    SYSCTL_RCGCI2C_R = (1 << 4) | (1 << 6);  //Mode Clock Gating Control for I2C modules 4 and 6
    GPIO_PORTK_AFSEL_R = 0xC0;      //Alternate Function Select PK6, PK7
    GPIO_PORTB_AHB_AFSEL_R = 0xC0;  //Alternate Function Select PB6, PB7
    GPIOPinConfigure(GPIO_PK6_I2C4SCL);
    GPIOPinConfigure(GPIO_PK7_I2C4SDA);
    GPIOPinConfigure(GPIO_PB6_I2C6SCL);
    GPIOPinConfigure(GPIO_PB7_I2C6SDA);

    GPIOPinTypeI2C(GPIO_PORTK_BASE, 7);       //Configurtes SDA
    GPIOPinTypeI2CSCL(GPIO_PORTK_BASE, 6);    //Configurtes SCL
    GPIOPinTypeI2C(GPIO_PORTB_BASE, 7);       //Configurtes SDA
    GPIOPinTypeI2CSCL(GPIO_PORTB_BASE, 6);    //Configurtes SCL

    I2CMasterInitExpClk(I2C4_BASE, SysCtlClockGet(), false);

    I2CSlaveEnable(I2C6_BASE);
    I2CSlaveInit(I2C6_BASE, SLAVE_ADDRESS);
    I2CMasterSlaveAddrSet(I2C4_BASE, SLAVE_ADDRESS, false);
    //
    //Loop forever.
    //
    while(1)
    {
        //
        //Turn on the LED.
        //
        GPIO_PORTD_AHB_DATA_R |= 0x8;

        I2CMasterDataPut(I2C4_BASE, 0x33);
        I2CMasterControl(I2C4_BASE, I2C_MASTER_CMD_SINGLE_SEND);
        //
        //Wait until the slave has received and acknowledged the data.
        //
        while(!(I2CSlaveStatus(I2C6_BASE) & I2C_SLAVE_ACT_RREQ));
        //
        //Read the data from the slave.
        //
        result = I2CSlaveDataGet(I2C6_BASE);
        //
        //Wait until master module is done transferring.
        //
        while(I2CMasterBusy(I2C4_BASE));
        //
        //Delay for a bit.
        //
        delay ();
        //
        //Turn off the LED.
        //
        GPIO_PORTD_AHB_DATA_R &= ~(0x8);
        //
        //Delay for a bit.
        //
        delay ();
    }
}
  • Haben Sie pull-up widerstände auf die I2C Leitungen? I2C ist ein open-collector-melde-system, so dass der bus benötigt pull-up widerstände, um zu funktionieren. Für Ihren test, können Sie wahrscheinlich aktivieren Sie den GPIO ' s interne pull-ups, wenn verfügbar.
  • Ein Verfahren GPIOPinTypeI2C() schaltet die internen pull-up-Widerstand auf, aber ein SDA wartet auf Hohem Niveau. Das problem ist meiner Meinung nach auf SCL-Seite.
  • Was ist die Funktion GPIOPinTypeI2CSCL? Heißt es für die beiden SCL-pins (master/slave). Das mag erklären, warum die SDA ist okay, aber SCL ist nicht.
  • Wenn diese Funktionen abgefragt werden, dann sind Sie möglicherweise nicht in der Lage, das zu tun diese so, wie Sie möchten. Die I2C-slave-clock stretching, bis Sie rufen Sie die I2CSlaveDataGet Funktion, aber der code kann blockiert werden, die auf einer der früheren I2C master fordert die warten, um in der Lage sein, zu senden. Ich bin nicht vertraut genug mit diesem Teil der I2C-Treiber in der Lage sein zu diagnostizieren, wenn das ist die Frage.
  • Nach Peripheral Driver Library USER ' S GUIDE GPIOPinTypeI2C Beschreibung: Die I2C-pins müssen richtig konfiguriert sein, für die I2C-Peripherie richtig zu funktionieren. Diese Funktion bietet Ihnen die passende Konfiguration für den SDA pin. GPIOPinTypeI2CSCL Beschreibung: Die I2C-pins müssen richtig konfiguriert sein, für die I2C-Peripherie richtig zu funktionieren. Diese Funktion bietet Ihnen die passende Konfiguration für den SCL-pin.
  • Das Verfahren stecken an while(!(I2CSlaveStatus(I2C6_BASE) & I2C_SLAVE_ACT_RREQ)); Aber du hast Recht, mit den clock-stretching, aber es ist auf Niedrigem Niveau.
  • Berücksichtigen Sie auch, dass die software die Genauigkeit für I2C-Betrieb ist wichtig, sehr viel. I2C ist ein launisch-bus, und die Geräte sind zu. Wenn Sie sagen, push-falsche Adresse auf den BUS und kein slave antwortet, dann bei Ihnen der master-Seite ist es, einige der Fehler-Zustand und ist sofort stecken irgendwo, bis die status - /Fehler werden verarbeitet richtig. Just bewusst sein, dass Dinge wie.

InformationsquelleAutor MarcoPolo | 2014-07-09
Schreibe einen Kommentar