Forum: Mikrocontroller und Digitale Elektronik I2C ATSAME70N20


von Hannes (taurus16)


Lesenswert?

Moin,
ich bin gerade auf der Fehlersuche an der I2C/TWI Schnittstelle am 
ATSAME70N20. Ich hänge nur mit 2 Pullups (4,7K) und Oszi an der 
Schnittstelle und sehe 3,3V. Ich nutze die TWIHS0 an PA3 und PA4, dazu 
aktuell noch den Systemtakt mit 12MHz.

Ich bin ein bisschen Ideenlos warum gar nichts passiert. (Weder Takt 
noch Daten).

Hier mein Code:
1
#include "I2C.h"
2
#include "sam.h"
3
#include "same70n20.h"
4
5
#define I2C_CLK_SPEED   100000
6
#define I2C_MODULE    TWIHS0
7
8
void I2C_Master_Init(void){
9
  /* Enable TWI peripheral clock */
10
  PMC->PMC_PCER0 = PMC_PCER0_PID19;
11
  
12
  /* Configure PIOA Pins for I2C */
13
  PIOA->PIO_PDR = (PIO_PDR_P3 | PIO_PDR_P4);
14
    PIOA->PIO_ABCDSR[0] &= ~(PIO_ABCDSR_P3 | PIO_ABCDSR_P4);
15
    PIOA->PIO_ABCDSR[1] &= ~(PIO_ABCDSR_P3 | PIO_ABCDSR_P4);
16
  
17
  /* Configure TWI clock waveform generator */
18
  I2C_MODULE->TWIHS_CWGR =  TWIHS_CWGR_CLDIV(((SystemCoreClock / (2 * I2C_CLK_SPEED))) - 3) |
19
                TWIHS_CWGR_CHDIV(((SystemCoreClock / (2 * I2C_CLK_SPEED))) - 3) |
20
                TWIHS_CWGR_CKDIV(0);          
21
  /* Enable TWI module */
22
  I2C_MODULE->TWIHS_CR = TWIHS_CR_SWRST;
23
  I2C_MODULE->TWIHS_CR = TWIHS_CR_SVDIS;
24
  I2C_MODULE->TWIHS_CR = TWIHS_CR_MSEN; 
25
}
26
27
uint8_t I2C_write_data(uint8_t* data, uint8_t length, uint8_t sendStopCondition, uint8_t address) {
28
  //Set slave address    
29
  I2C_MODULE->TWIHS_MMR = TWIHS_MMR_IADRSZ(0);
30
  I2C_MODULE->TWIHS_MMR |= TWIHS_MMR_DADR(address);
31
  I2C_MODULE->TWIHS_MMR &=~ TWIHS_MMR_MREAD;  
32
  I2C_MODULE->TWIHS_CR = TWIHS_CR_MSEN;
33
  
34
    for (uint8_t i = 0; i < length; i++){
35
    //send data
36
         I2C_MODULE->TWIHS_THR = data[i];
37
         while(!(I2C_MODULE->TWIHS_SR & TWIHS_SR_TXRDY));
38
  }
39
  
40
  //if we have to send stop condition (instead of a new start condition)
41
  if(sendStopCondition){
42
    /* Send stop condition */
43
    I2C_MODULE->TWIHS_CR = TWIHS_CR_STOP;
44
    while (!(I2C_MODULE->TWIHS_SR & TWIHS_SR_TXCOMP));
45
    }
46
  return I2C_NO_ERROR_DETECTED;
47
}

Hat jemand von euch noch eine zündende Idee?
Gruß
Hannes

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.