基于sopc的iic总线对24LC256读写操作
2013-11-20 15:14
302 查看
/*-------------------------------------------------------------------------------------- * Include main函数 *-------------------------------------------------------------------------------------*/ #include <unistd.h> #include "../inc/iic.h" #include <stdio.h> #include "alt_types.h" int main() { alt_u16 i; alt_u8 dat,dat1; alt_u8 cnt[]={0x80 , 0x81 ,0x83 , 0x84 ,0x86 , 0x87 , 0x89 , 0x8A}; printf("\nWriting data to 24LC256!\n"); //while(1) //{ for(i=0; i<8; i++) { dat=cnt[i]; iic.write_byte(i,i, dat); printf("0x%0x\n", dat); usleep(10000); } // if(i==512) // { // i=0; // } // } printf("\nReading data from 24LC256!\n"); for(i=0; i<8; i++) { dat1=0; dat1=iic.read_byte(i,i); printf("0x%0x\n", dat1); usleep(1000); } return 0; } #ifndef IIC_H_ #define IIC_H_ /*-------------------------------------------------------------------------------------- * Define iic.h *-------------------------------------------------------------------------------------*/ #define OUT 1 #define IN 0 #define wr 0xa0 #define rd 0xa1 /*-------------------------------------------------------------------------------------- * Struct *-------------------------------------------------------------------------------------*/ typedef struct{ void (* write_byte)(unsigned short addrh, unsigned short addrl, unsigned char dat); unsigned char (* read_byte)(unsigned short addrh,unsigned short addrl); }IIC; extern IIC iic; #endif /*IIC_H_*/ /*-------------------------------------------------------------------------------------- * iic.c *-------------------------------------------------------------------------------------*/ #include <stdio.h> #include <sys/unistd.h> #include <io.h> #include "system.h" #include "altera_avalon_pio_regs.h" #include "alt_types.h" #include "../inc/iic.h" alt_u8 tmp; static alt_u8 read_byte(alt_u16 addrh,alt_u16 addrl); static void write_byte(alt_u16 addrh,alt_u16 addrl,alt_u8 dat); /*-------------------------------------------------------------------------------------- * Struct *-------------------------------------------------------------------------------------*/ IIC iic ={ .write_byte = write_byte, .read_byte = read_byte }; /* * === FUNCTION =================================================== * Name: start * Description: IIC启动 * ================================================================= */ static void start(void) { IOWR_ALTERA_AVALON_PIO_DIRECTION(SDA_BASE, OUT); IOWR_ALTERA_AVALON_PIO_DATA(SDA_BASE, 1); IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 1); usleep(10); IOWR_ALTERA_AVALON_PIO_DATA(SDA_BASE, 0); usleep(10); IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 0); usleep(5); } /* * === FUNCTION =================================================== * Name: uart_send_byte * Description: IIC停止 * ================================================================== */ static void stop(void) { IOWR_ALTERA_AVALON_PIO_DIRECTION(SDA_BASE, OUT); IOWR_ALTERA_AVALON_PIO_DATA(SDA_BASE, 0); usleep(10); IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 0); usleep(10); IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 1); usleep(10); IOWR_ALTERA_AVALON_PIO_DATA(SDA_BASE, 1); usleep(10); } /* * === FUNCTION =================================================== * Name: ack * Description: IIC应答 * ================================================================= */ static void ack(void) { // alt_u8 tt; alt_u8 tmp=1; // tt=0; IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 0); IOWR_ALTERA_AVALON_PIO_DIRECTION(SDA_BASE, IN); usleep(20); IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 1); do { tmp = IORD_ALTERA_AVALON_PIO_DATA(SDA_BASE); }while(tmp==1); // }while(tmp==1 && tt++<100); usleep(5); IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 0); usleep(10); } /* * === FUNCTION =================================================== * Name: iic_write * Description: IIC写一个字节 * ================================================================= */ void iic_write(alt_u8 dat) { alt_u8 i, tmp; IOWR_ALTERA_AVALON_PIO_DIRECTION(SDA_BASE, OUT); for(i=0; i<8; i++){ IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 0); usleep(5); tmp = (dat & 0x80) ? 1 : 0; dat <<= 1; IOWR_ALTERA_AVALON_PIO_DATA(SDA_BASE, tmp); usleep(5); IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 1); usleep(10); } } /* * === FUNCTION =================================================== * Name: read * Description: IIC读一个字节 * ================================================================== */ static alt_u8 iic_read(void) { alt_u8 i, dat; IOWR_ALTERA_AVALON_PIO_DIRECTION(SDA_BASE, IN); for(i=0; i<8; i++){ IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 0); usleep(10); IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 1); usleep(5); dat <<= 1; dat |= IORD_ALTERA_AVALON_PIO_DATA(SDA_BASE); usleep(5); } usleep(5); IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 0); usleep(10); IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 1); usleep(10); IOWR_ALTERA_AVALON_PIO_DATA(SCL_BASE, 0); return dat; } /* * === FUNCTION =================================================== * Name: write_byte * Description: 向EEPROM写一个字节 * ================================================================= */ static void write_byte(alt_u16 addrh,alt_u16 addrl,alt_u8 dat) { start(); iic_write(wr); ack(); iic_write(addrh); ack(); iic_write(addrl); ack(); iic_write(dat); ack(); stop(); } /* * === FUNCTION =================================================== * Name: read_byte * Description: 从EEPROM读一个字节 * ================================================================= */ static alt_u8 read_byte(alt_u16 addrh,alt_u16 addrl) { alt_u8 dat; start(); iic_write(wr); ack(); iic_write(addrh); ack(); iic_write(addrl); ack(); start(); iic_write(rd); ack(); dat = iic_read(); stop(); return dat; }
相关文章推荐
- 基于嵌入式linux iic 总线读写mpu6050
- 基于mini6410平台:uboot添加支持IIC总线的eeprom读写
- 基于FPGA EEPROM读写实现及IIC总线协议和时序分析
- 基于proteus的51单片机仿真实例六十六、I2C总线上接两个AT24C02读写实例
- 基于.net类库的注册表自定义项读写操作
- AT24Cxx芯片读写--IIC总线
- EEPROM通过IIC协议进行读写操作
- EEPROM通过IIC协议进行读写操作
- 【转】TQ2440的学习——IIC总线的操作
- c#/.net 基于文件流FileStream读写的文本操作小程序
- 轻松完成excel读写操作- 基于POI的框架BingExcel的使用(1)
- C#实现的基于二进制读写文件操作示例
- 基于smdk2410 开发板u-boot-1.2.0 nand flash读写操作及其命令的实现
- IIC总线操作AT24C02芯片
- 在基于OMAP3530的DevKit8000开发板上实现Linux操作系统下的GPIO读写操作
- Linux ARM IIC I2C EEPROM 读写操作
- XML 读写(基于流的操作)
- BeagleBone Black CAN总线读写数据操作
- 基于smdk2410 开发板u-boot-1.2.0 nand flash读写操作及其命令的实现(续)
- C#中基于FileStream的文本文件读写操作