mirror of
				https://github.com/marqs85/ossc
				synced 2025-10-30 07:26:03 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			100 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* these test were created to show how to use the opencores I2C along with a driver found in
 | |
|  * the I2C_opencores component to talk to various components. 
 | |
|  * This test example uses a littel daughter board from microtronix
 | |
|  * it has a I2c to parallel chip (PCA9554A) a EEPORM and real time clock. 
 | |
|  * I chose not to impliment the real time clock. 
 | |
|  * But you can see how the calls work
 | |
|  * There are only 4 functions associalted with the I2C driver
 | |
|  * I2C start  -  send start bit and address of the chip
 | |
|  * I2C_read - read data
 | |
|  * I2C_write. - write data
 | |
|  * how and when each of these get used is based on the device you
 | |
|  * are talking to. 
 | |
|  * See the driver code for details of each function. 
 | |
|  * */
 | |
| 
 | |
| #include <stdio.h>
 | |
| #include "system.h"
 | |
| #include "i2c_opencores.h"
 | |
| int main()
 | |
| {
 | |
|     int data;
 | |
|     int i;
 | |
|     // testing the PCA9554A paralle interface
 | |
|     // this writes a 5 to the leds and read the position of the dip switches.
 | |
|  printf(" tesing the PCA9554A interface the\n the LEDS should be at a 5 \n");  
 | |
|  // address 0x38 
 | |
|  // set the fequesncy that you want to run at 
 | |
|  // most devices work at 100Khz  some faster
 | |
|  I2C_init(I2CA_BASE,ALT_CPU_FREQ,100000);
 | |
|  I2C_init(I2CA_BASE,ALT_CPU_FREQ,100000);
 | |
|  // for the parallel io only the first 4 are output s
 | |
|  
 | |
|  // the PCA9554A   uses a command word right after the chip address word ( the start work)
 | |
|  I2C_start(I2CA_BASE,0x38,0);// chip address in write mode
 | |
|  I2C_write(I2CA_BASE,3,0);  // write to register 3 command
 | |
|  I2C_write(I2CA_BASE,0xf0,1);  // set the bottom 4 bits to outputs for the LEDs set the stop
 | |
|  
 | |
|  // now right to the leds
 | |
|   I2C_start(I2CA_BASE,0x38,0); // address the chip in write mode
 | |
|  I2C_write(I2CA_BASE,1,0);  // set command to the pca9554 to be output register
 | |
|  I2C_write(I2CA_BASE,5,1);  // write the data to the output register and set the stop
 | |
| 
 | |
| //now read the dip switches
 | |
| // first set the command to 0
 | |
|  I2C_start(I2CA_BASE,0x38,0); //address the chip in write mode
 | |
| data =  I2C_write(I2CA_BASE,0,0);  // set command to read input register.
 | |
|  I2C_start(I2CA_BASE,0x38,1); //send start again but this time in read mode
 | |
| data =  I2C_read(I2CA_BASE,1);  // read the input register and send stop
 | |
| data = 0xff & (data >>4);   
 | |
| printf("dip switch 0x%x\n",data);
 | |
| 
 | |
| printf("\nNow writing and reading from the EEPROM\n");
 | |
| //address 0x50-57
 | |
| I2C_start(I2CA_BASE,0x50,0); // chip address in write mode
 | |
| I2C_write(I2CA_BASE,0,0);  // write to starting address of 0
 | |
| // now write the data 
 | |
| for (i=0;i<7;i++)           // can only write 8 bites at a time
 | |
| {   
 | |
|  I2C_write(I2CA_BASE,i,0);  // writ the data 
 | |
| }
 | |
|  I2C_write(I2CA_BASE,i,1);  // write last one with last flag
 | |
|  
 | |
|  while ( I2C_start(I2CA_BASE,0x50,0)); // make sure the write is done be fore continuing.
 | |
|  // can ony burst 8 at a time.
 | |
| 
 | |
| I2C_write(I2CA_BASE,8,0);  // write to starting address of 8
 | |
| // now write the data 
 | |
| for (i=0;i<7;i++)   // write the next 8 bytes
 | |
| {
 | |
|  I2C_write(I2CA_BASE,i+8,0);  // 
 | |
| }
 | |
|  I2C_write(I2CA_BASE,i+8,1);  // write last one with last flag
 | |
|  
 | |
|  while ( I2C_start(I2CA_BASE,0x50,0)); // make sure the write is done be fore continuing.
 | |
|  
 | |
|  //now read the values
 | |
| // first set the command to 0
 | |
|  I2C_start(I2CA_BASE,0x50,0); //set chip address and set to write/
 | |
|  I2C_write(I2CA_BASE,0,0);  // set address to 0.
 | |
| I2C_start(I2CA_BASE,0x50,1); //set chip address in read mode
 | |
| for (i=0;i<15;i++)
 | |
| {
 | |
|  data =  I2C_read(I2CA_BASE,0);  // memory array
 | |
|  printf("\tdata = 0x%x\n",data);
 | |
| }
 | |
| 
 | |
| data =  I2C_read(I2CA_BASE,1);  // last memory read
 | |
|  printf("\tdata = 0x%x\n",data);
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|   printf("Hello from Nios II!\n");
 | |
| 
 | |
|   return 0;
 | |
| }
 | 
