1. #include <periperals/i2c_master.h>
... wird immer automatisch vom SpartanMC System geladen. Der Include muss nicht in der C-Quelle erfolgen.
#ifndef __I2C_MASTER_
#define __I2C_MASTER_
/*
* Definitions for the Opencores i2c master core
*/
// Rückgabewerte für non blocking read
#define I2C_OK 0
#define I2C_NO_ACK 1
/* --- Definitions for i2c master's registers --- */
/* ----- Read-write access */
/* ----- Bits definition */
/* ----- Control register */
#define I2C_EN (1<<16) /* Core enable bit: */
/* 1 - core is enabled */
/* 0 - core is disabled */
#define I2C_IEN (1<<17) /* Interrupt enable bit */
/* 1 - Interrupt enabled */
/* 0 - Interrupt disabled */
/* Other bits in CR are reserved */
/* ----- Command register bits */
#define I2C_STA (1<<7) /* Generate (repeated) start condition*/
#define I2C_STO (1<<6) /* Generate stop condition */
#define I2C_RD (1<<5) /* Read from slave */
#define I2C_WR (1<<4) /* Write to slave */
#define I2C_NAK (1<<3) /* Acknowledge send to slave */
/* 0 - ACK */
/* 1 - NACK */
#define I2C_ACK 0
#define I2C_IACK (1<<0) /* Interrupt acknowledge */
/* ----- Status register bits */
#define I2C_RXACK (1<<7) /* ACK received from slave */
/* 0 - ACK */
/* 1 - NACK */
#define I2C_BUSY (1<<6) /* Busy bit */
#define I2C_AL (1<<5) /* Arbitration lost */
#define I2C_R_W (1<<2) /* last byte read or write */
/* 0 - READ */
/* 1 - WRITE */
#define I2C_TIP (1<<1) /* Transfer in progress */
#define I2C_IF (1<<0) /* Interrupt flag */
typedef struct i2c_master {
volatile unsigned int ctrl; // (r/w)
volatile unsigned int txr; // (r/w)
volatile unsigned int rxr; // (r)
volatile unsigned int cmd; // (r/w)
volatile unsigned int stat; // (r)
} i2c_master_regs_t;
#endif //define __I2C_MASTER
2. #include <i2c_master.h>
... muss in der C-Quelle geladen werden, wenn man die Funktionen verwenden will.
#ifndef I2C_MASTER___
#define I2C_MASTER___
#include <peripherals/i2c_master.h>
// user funktion
int i2c_master_write(struct i2c_master *i2c_m, unsigned int slave_addr, unsigned int anz, unsigned int * dataw);
int i2c_master_reada(struct i2c_master *i2c_m, unsigned int slave_addr, unsigned int anz, unsigned int * datar);
int i2c_master_readn(struct i2c_master *i2c_m, unsigned int slave_addr, unsigned int anz, unsigned int * datar);
int i2c_master_wr_rda(struct i2c_master *i2c_m, unsigned int slave_addr, unsigned int anzw, unsigned int * dataw, unsigned int anzr, unsigned int * datar);
int i2c_master_wr_rdn(struct i2c_master *i2c_m, unsigned int slave_addr, unsigned int anzw, unsigned int * dataw, unsigned int anzr, unsigned int * datar);
// intern only for write, wr_rda and wr_rdn
int i2c_master_wr_st(struct i2c_master *i2c_m, unsigned int slave_addr, unsigned int anz, unsigned int * dataw, unsigned int stop);
#endif //define __I2C_MASTER
- i2c_master_wr_st.c senden einer Anzahl Byte zum Slave mit oder ohne Stop (nur intern für die folgenden Funktionen)
- i2c_master_write.c senden einer Anzahl Byte zum Slave
- i2c_master_reada.c empfangen einer Anzahl Byte vom Slave und ACK auch beim letzten Byte
- i2c_master_readn.c empfangen einer Anzahl Byte vom Slave und NAK beim letzen Byte
- i2c_master_wr_rda.c senden einer Anzahl1 Byte gefolgt vom empangen einer Anzahl2 Byte mit ACK beim letzten Byte
- i2c_master_wr_rdn.c senden einer Anzahl1 Byte gefolgt vom empangen einer Anzahl2 Byte mit NAK beim letzten Byte