📄 test-iic.c
字号:
/*********************************************************************
* File: test-iic.c
* Author:
* Desc:
* History:
*********************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <linux/i2c.h>
#include <linux/fcntl.h>
/* control code */
#define I2C_SET_DATA_ADDR 0x0601
#define I2C_SET_BUS_CLOCK 0x0602
/* AT24C04N EEPROM definition */
#define SLAVE_ADDR 0x50
#define PAGE_NUM 32
#define PAGE_SIZE 16
/* buffer */
char w_buf[PAGE_NUM*PAGE_SIZE];
char r_buf[PAGE_NUM*PAGE_SIZE];
int main(int argc, char** argv)
{
int i, fd;
/* open device */
fd = open("/dev/i2c0", O_RDWR);
/* set AT24C04N slave address (0xa0 >> 1) */
ioctl(fd, I2C_SLAVE_FORCE, SLAVE_ADDR);
/* set i2c bus clock 250KHz */
ioctl(fd, I2C_SET_BUS_CLOCK, 250*1000);
/* initialize write buffer */
printf("Write random data...\n");
srand(time(NULL));
for(i=0; i<PAGE_NUM*PAGE_SIZE; i++)
{
w_buf[i] = rand()%0xff;
}
for(i=0; i<PAGE_NUM*PAGE_SIZE; i++)
{
printf("0x%02X ", w_buf[i]);
}
printf("\n");
/* write data to AT24C04N EEPROM */
for(i=PAGE_NUM-1; i>=0; i--)
{
/* AT24C04N inner data access address */
ioctl(fd, I2C_SET_DATA_ADDR, i*PAGE_SIZE);
write(fd, &w_buf[i*PAGE_SIZE], PAGE_SIZE);
/* delay some time for write nonvolatile memory. */
usleep(10*1000);
}
/* read data from AT24C04N EERROM */
printf("Read data...\n");
for(i=0; i<PAGE_NUM; i++)
{
/* AT24C04N inner data access address */
ioctl(fd, I2C_SET_DATA_ADDR, i*PAGE_SIZE);
read(fd, &r_buf[i*PAGE_SIZE], PAGE_SIZE);
}
/* print data */
for(i=0; i<PAGE_NUM*PAGE_SIZE; i++)
{
printf("0x%02X ", r_buf[i]);
}
printf("\n");
/* compare data */
if(memcmp(w_buf, r_buf, PAGE_NUM*PAGE_SIZE) == 0)
{
printf("Verify data successful.\n");
}
else
{
printf("Verify data failed.\n");
}
close(fd);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -