Nios® II Embedded Design Suite (EDS)
Support for Embedded Development Tools, Processors (SoCs and Nios® II processor), Embedded Development Suites (EDSs), Boot and Configuration, Operating Systems, C and C++
Announcements
Intel Support hours are Monday-Fridays, 8am-5pm PST, except Holidays. Thanks to our community members who provide support during our down time or before we get to your questions. We appreciate you!

Need Forum Guidance? Click here
Search our FPGA Knowledge Articles here.

opencoreI2C for cyclone3

Altera_Forum
Honored Contributor II
780 Views

Hi I am implementing opencoreI2C, can some one double check my code. I am new to opencoreso I am having problems in figuring out scl and sda. 

 

Here is my code 

# include <stdio.h># include "alt_types.h"# include "opencores_i2c_regs.h"# include "opencores_i2c.h" 

 

 

int main() 

/* IOWR_OPENCORES_I2C_CTR(0x0, 0xA); /* turn off the core*/ 

//IORD_OPENCORES_I2C_CTR(0x0); /* turn off the core*/ 

/* 

printf("IORD: %x",IORD_OPENCORES_I2C_CTR(0x0)); 

 

 

return 0; 

*/# define I2C_BASE 0x0# define clk ALT_CPU_FREQ# define speed 100000 

 

 

 

 

 

 

//I2C_init(alt_u32 base, alt_u32 clk, alt_u32 speed); 

// ++++++++++++++++++++++++ initialize ++++++++++++++++++++++++++++++++++++ 

 

 

//IOWR_OPENCORES_I2C_CTR(I2C_BASE,0); // turn off the core 

//int i = 100; 

//while (i!=0){ 

//printf("CTR %x at base %x \n",IORD_OPENCORES_I2C_CTR(I2C_BASE),I2C_BASE); 

//--i; 

//}# define I2C_DEBUG 

//int I2C_init(alt_u32 base,alt_u32 clk, alt_u32 speed) 

//int I2C_start(alt_u32 base, alt_u32 add, alt_u32 write); 

//alt_u32 I2C_read(alt_u32 base); 

//int I2C_write(alt_u32 base, alt_u8 data); 

//int I2C_stop(alt_u32 base); 

 

 

/* these functions are polled only. */ 

/* all functions wait until the I2C is done before exiting */ 

 

 

 

 

/**************************************************************** 

int I2C_init 

This function inititlizes the prescalor for the scl 

and then enables the core. This must be run before 

any other i2c code is executed 

inputs 

base = the base address of the component 

clk = freuqency of the clock driving this component ( in Hz) 

speed = SCL speed ie 100K, 400K ... (in Hz) 

15-OCT-07 initial release 

*****************************************************************/ 

 

 

 

 

 

 

IOWR_OPENCORES_I2C_CR(I2C_BASE, OPENCORES_I2C_CR_IACK_MSK); // clearn any pening IRQ 

IOWR_OPENCORES_I2C_PRERLO(I2C_BASE,0x31); // load low presacle bit 

IOWR_OPENCORES_I2C_PRERHI(I2C_BASE,0x00); // load upper prescale bit 

 

 

IOWR_OPENCORES_I2C_CTR(I2C_BASE,0x80); // turn on the core 

printf("CTR %x \n",IORD_OPENCORES_I2C_CTR(I2C_BASE)); 

 

 

//++++++++++++++++++++++++ send slave address and verify ++++++++++++++++++ 

 

 

IOWR_OPENCORES_I2C_TXR (I2C_BASE, 0x3A); 

IOWR_OPENCORES_I2C_CR(I2C_BASE, 0x90); 

 

 

 

 

 

 

while( IORD_OPENCORES_I2C_SR(I2C_BASE) & OPENCORES_I2C_SR_TIP_MSK) 

 

 

 

 

{printf( "TIP 1\n"); 

//while(( IORD_OPENCORES_I2C_SR(I2C_BASE) & 0x02) == 0x02) 

//{printf( "TIP 1 & SR = %x \n",IORD_OPENCORES_I2C_SR(I2C_BASE));} 

 

 

printf( "SR = %x \n",IORD_OPENCORES_I2C_SR(I2C_BASE)); 

 

 

while((IORD_OPENCORES_I2C_SR(I2C_BASE) & 0x80) == 0x80) 

{printf("NO ACK 1\n"); 

IOWR_OPENCORES_I2C_TXR (I2C_BASE, 0x3A); 

IOWR_OPENCORES_I2C_CR(I2C_BASE, 0x80); 

while(( IORD_OPENCORES_I2C_SR(I2C_BASE) & 0x02) == 0x02) 

printf( "TIP 1 & SR = %x \n",IORD_OPENCORES_I2C_SR(I2C_BASE)); 

 

 

 

 

printf("hi"); 

 

 

//else //++++++++++++++ send slave register address to be read from ++++++++++ 

printf("ACK 1\n"); 

printf( "SR = %x \n",IORD_OPENCORES_I2C_SR(I2C_BASE)); 

IOWR_OPENCORES_I2C_TXR(I2C_BASE, 0x00); 

 

 

IOWR_OPENCORES_I2C_CR(I2C_BASE, 0x90); 

 

 

while( (IORD_OPENCORES_I2C_SR(I2C_BASE) & 0x02) == 0x02 ) 

{printf( "TIP 2 \n");} 

 

 

if((IORD_OPENCORES_I2C_SR(I2C_BASE) & 0x80) == 0x80) 

printf("\t NO ACK 2\n"); 

else{ 

IOWR_OPENCORES_I2C_TXR(I2C_BASE, 0x3B); 

 

 

IOWR_OPENCORES_I2C_CR(I2C_BASE, 0x90); 

 

 

{printf( "TIP 3 \n");} 

 

 

if((IORD_OPENCORES_I2C_SR(I2C_BASE) & 0x80) == 0x80) 

printf("\t NO ACK 3\n"); 

else{ 

alt_u32 x = IORD_OPENCORES_I2C_RXR(I2C_BASE); 

printf("Received Byte %x \n",x); 

IOWR_OPENCORES_I2C_CR(I2C_BASE, 0x08); 

IOWR_OPENCORES_I2C_CR(I2C_BASE, 0x08); 

IOWR_OPENCORES_I2C_CTR(I2C_BASE,0x00); 

 

 

 

 

return 0; 

 

 

}
0 Kudos
0 Replies
Reply