void iic_control (unsigned char addr, unsigned char loc, unsigned char *buf, int len) { iic_start(); if (iic_sendbyte(addr & 0xfe)) goto error; if (iic_sendbyte(loc)) goto error; if (addr & 1) { int i; for (i = 0; i < len; i++) if (iic_sendbyte (buf[i])) break; } else { int i; iic_stop(); iic_start(); iic_sendbyte(addr|1); for (i = 0; i < len; i++) buf[i] = iic_recvbyte (); } error: iic_stop(); }
/*----------------------------------------------------------------------------*/ void iic_write(u8 chip_id,u8 iic_addr,u8 *iic_dat,u8 n) { iic_busy = 1; iic_start(); //I2C启动 iic_sendbyte(chip_id); //写命令 if (0xff != iic_addr) { iic_sendbyte(iic_addr); //写地址 } for (;n>0;n--) { iic_sendbyte(*iic_dat++); //写数据 } iic_stop(); //I2C停止时序 iic_busy = 0; }
/*----------------------------------------------------------------------------*/ void iic_readn(u8 chip_id,u8 iic_addr,u8 *iic_dat,u8 n) { iic_busy = 1; iic_start(); //I2C启动 iic_sendbyte(chip_id); //写命令 if (0xff != iic_addr) { iic_sendbyte(iic_addr); //写地址 } for (;n>1;n--) { *iic_dat++ = iic_revbyte(0); //写数据 } *iic_dat++ = iic_revbyte(1); iic_stop(); //I2C停止时序 iic_busy = 0; }
/*----------------------------------------------------------------------------*/ u8 read_eerom(u16 iic_addr) { u8 byte,addr=0,page=0; iic_busy = 1; addr=EEPROM_Addr_Align(iic_addr); page =EEPROM_Addr_to_Page(iic_addr); iic_start(); //I2C启动 iic_sendbyte(0xa0|page); //写命令 iic_sendbyte(addr); //写地址 iic_start(); //写转为读命令,需要再次启动I2C iic_sendbyte(0xa1|page); //读命令 byte = iic_revbyte(1); iic_stop(); //I2C停止 iic_busy = 0; return byte; }
/*----------------------------------------------------------------------------*/ void backup_music_point_to_eeprom(void) { u8 cnt,i; eeprom_page_write_start(); if (device_active == DEVICE_SDMMC0) { cnt = 0; iic_sendbyte(MEM_SD_PLAYPOINT_ID1); } else if (device_active == DEVICE_UDISK) { cnt = 1; iic_sendbyte(MEM_USB_PLAYPOINT_ID1); } for ( i = 0;i<8;i++) { iic_sendbyte(((u8 *)(&(disk_mus_point[cnt].id1)))[i]); } eeprom_page_write_stop(); }
void eeprom_page_write_start(void) { iic_busy = 1; iic_start(); //I2C启动 iic_sendbyte(0xa0); //写命令 }