i2c_memutil.c
来自「* Use 10 MHz crystal frequency. * Use 」· C语言 代码 · 共 87 行
C
87 行
#ifndef I2CMEMUTIL_C#define I2CMEMUTIL_Cvoid i2c_memwrite(char i2caddr, unsigned int addr, unsigned char *buf);void i2c_memread(char i2caddr, unsigned int addr, unsigned char *buf);#define BLKSIZE 64//write a blockvoid i2c_memwrite(char i2caddr, unsigned int addr, unsigned char *buf){ unsigned char addr_lo, addr_hi; char k,ack; addr_lo = addr & 0x00FF; addr_hi = (addr >> 8); if (addr & 0x8000) { // if MSB set , set block select bit i2caddr = i2caddr | 0x08; } i2caddr = i2caddr & 0xFE; //R/W# = 0; // check if last write complete do { i2c_start(); ack = i2c_put_noerr(i2caddr); i2c_stop(); } while(ack); // now do page write i2c_start(); i2c_put(i2caddr); // send write command i2c_put(addr_hi); // send high address byte i2c_put(addr_lo); // send low address byte for (k=0;k<BLKSIZE;k++) { i2c_put(buf[k]); // send data } i2c_stop();}//read a blockvoid i2c_memread(char i2caddr, unsigned int addr, unsigned char *buf){ unsigned char addr_lo, addr_hi; char k,ack; addr_lo = addr & 0x00FF; addr_hi = (addr >> 8); if (addr & 0x8000) { // if MSB set , set block select bit i2caddr = i2caddr | 0x08; } i2caddr = i2caddr & 0xFE; //R/W# = 0; // check if last write complete // write command will NAK if not complete do { i2c_start(); ack = i2c_put_noerr(i2caddr); i2c_stop(); } while(ack); //set address counter i2c_start(); i2c_put(i2caddr); // send command i2c_put(addr_hi); // send high address byte i2c_put(addr_lo); // send low address byte i2caddr = i2caddr | 0x01; //R/W# = 1; i2c_rstart(); // repeated start i2c_put(i2caddr); // send command for (k=0;k<BLKSIZE;k++) { if (k== 63) { // get last byte, do NAK buf[k] = i2c_get(1); i2c_stop(); } else // get data, do ACK buf[k] = i2c_get(0); }}#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?