I2C

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


SpartanMC