//*************************************************** //从无子地址器件读单字节数据 //function:器件地址,所读数据存在接收缓冲区当前字节 void read_from_ch(unsigned char ad_main,unsigned char *buf){ IIC_start(); send_ch(ad_main); //发送器件地址 *buf=read_ch(); IIC_ack_main(no_ack); //无需应答<no_ack=0> IIC_stop(); }
//写入 void MMA845x_writecha(unsigned char address, unsigned char thedata) { IIC_start(); //启动 send_ch(MMA845x_IIC_ADDRESS); //写入设备ID及写信号 send_ch(address); //X地址 send_ch(thedata); //写入设备ID及读信 IIC_stop(); }
/***************************************************************************************** * Write_IIC_Bytes * Function : Write data from dev at addr * Action : * Input : addr--the address which start to Write, buffer--the pointer to buffer used to store data len-- the length of data needed to read * Output : None * Return : 1--success 0--fail *****************************************************************************************/ uint8 Write_IIC_Bytes(const void *buffer, uint8 dev, uint16 addr, uint16 lenth)//(uint16 addr, const void *buffer, uint16 lenth, uint8 dev) { uint8 * p; uint16 cTemp0,cTemp1; uint8 flag; for(cTemp1 = EE_TryTimes; cTemp1 != 0; cTemp1--) { if(cTemp1) { if (detect_sda() == FALSE) { continue; } } IIC_start(); if(!EEPROM_AddrSend(dev, addr)) { continue; } p = (uint8 *)buffer; for(cTemp0 = lenth; cTemp0 > 0; cTemp0--) { flag = IIC_send400k(*p); if(!flag) { break; } p++; } if(cTemp0 != 0) { continue; } IIC_stop(); return TRUE; } IIC_stop(); return FALSE; }
//*************************************************** //向有子地址器件发送多字节数据 void send_to_nch(unsigned char ad_main,unsigned char ad_sub,unsigned char *buf,unsigned char num){ unsigned char i; IIC_start(); send_ch(ad_main); //发送器件地址 send_ch(ad_sub); //发送器件子地址 for(i=0;i<num;i++){ send_ch(*buf); //发送数据*buf buf++; } IIC_stop(); }
void iic2402_write(uint8 address, uint8 byte) { IIC_start(); IIC_write_byte(0xa0); IIC_tack(); IIC_write_byte(address); IIC_tack(); IIC_write_byte(byte); IIC_tack(); IIC_stop(); delay(); }
unsigned char MMA845x_readch(unsigned char address) { unsigned char ret = 100; IIC_start(); //启动 send_ch(MMA845x_IIC_ADDRESS); //写入设备ID及写信号 send_ch(address); //X地址 IIC_start(); //重新发送开始 send_ch(MMA845x_IIC_ADDRESS+1); //写入设备ID及读信 ret = read_ch(); //读取一字节 IIC_stop(); return ret; }
//*************************************************** //从有子地址器件读多个字节数据 //function: void read_from_nch(unsigned char ad_main,unsigned char ad_sub,unsigned char *buf,unsigned char num){ unsigned char i; IIC_start(); send_ch(ad_main); send_ch(ad_sub); for(i=0;i<num-1;i++){ *buf=read_ch(); IIC_ack_main(ack); //主应答<ack=1> buf++; } *buf=read_ch(); buf++; //本次指针调整无意义,目的是操作后buf指向下一地址 IIC_ack_main(no_ack); //无需应答<no_ack=0> IIC_stop(); }
uint8 iic2402_read(uint8 address) { uint8 tmp; IIC_start(); IIC_write_byte(0xa0); IIC_tack(); IIC_write_byte(address); IIC_tack(); IIC_start(); IIC_write_byte(0xa1); IIC_tack(); tmp = IIC_read_byte(); SCL_LOW; IIC_notack(); IIC_stop(); return tmp; }
/***************************************************************************************** * read_IIC_bytes * Function : Read data from dev at addr * Action : * Input : addr--the address which start to read, buffer--the pointer to buffer used to store data len-- the length of data needed to read, dev-- read from which device * Output : None * Return : 1--success 0--fail *****************************************************************************************/ uint8 read_IIC_bytes(void *buffer, uint8 dev, uint16 addr, uint16 lenth)//(uint16 addr, void *buffer, uint16 lenth, uint8 dev) { uint8 *p ; uint16 cTemp1,cTemp0; for(cTemp1 = EE_TryTimes; cTemp1 != 0; cTemp1--) { if(cTemp1) { if (detect_sda() == FALSE) { continue; } } IIC_start(); if(!EEPROM_AddrSend(dev,addr)) { continue; } p = (uint8 *)buffer; IIC_start(); #if EEPROMTYPE <= 16 if(!IIC_send400k(dev | 0x01 | ((unsigned char)(addr / 0x100) << 1))) { continue; } #elif EEPROMTYPE <= 512 if(!IIC_send400k(dev | 0x01)) { continue; } #else if(!IIC_send400k(dev | 0x01 | ((unsigned char)(addr >> 16) << 1))) { continue; } #endif for(cTemp0 = lenth-1; cTemp0 != 0; cTemp0--) { *p = IIC_receive400k(); p++; SET_IIC_SDA_OUTPUT(); // ack CLR_IIC_SDA(); SET_IIC_SCL(); Dly1us(); CLR_IIC_SCL(); SET_IIC_SDA(); } *p = IIC_receive400k(); SET_IIC_SDA_OUTPUT(); SET_IIC_SDA(); SET_IIC_SCL();//收完最后一个字节发送NO ACK信号 Dly1us(); CLR_IIC_SCL(); IIC_stop(); return TRUE; } IIC_stop(); return FALSE; }
//*************************************************** //向无子地址器件发送单字节数据 void send_to_ch(unsigned char ad_main,unsigned char c){ IIC_start(); send_ch(ad_main); //发送器件地址 send_ch(c); //发送数据c IIC_stop(); }