📄 i2c_memutil.c
字号:
#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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -