#define I2C_BUS "/dev/i2c-1"
#define ISL2108_ADDR 0x6F
static int i2c_write_bytes(int fd, uint8_t slave_addr, uint8_t reg_addr, uint8_t *values, uint8_t len);
typedef struct time_datas
#define SET_BIT(x, bit) (x |= (1 << bit))
#define SET_PIN(PIN, N) (PIN &= ~(1 << N))
return (((i / 10) << 4) + ((i % 10) & 0x0f));
return (0xff & (bcd >> 4)) * 10 + (0xf & bcd);
time_datas gettimedate(time_datas _time_datas)
framev._time_data[0] = 0x00;
framev._time_data[1] = 0x00;
framev._time_data[2] = 0x00;
framev._time_data[3] = 0x00;
framev._time_data[4] = 0x00;
framev._time_data[5] = 0x00;
framev._time_data[6] = 0x00;
framev._time_data[7] = 0x00;
framev._time_data[8] = 0x00;
framev._time_data[9] = 0x00;
framev._weeks = IntToBCD(_time_datas._weeks);
printf("报警时钟星期[%d],_enable:=[%d]\n", _time_datas._weeks, _time_datas._weeks_enable);
if (_time_datas._weeks_enable == 1)
SET_BIT(framev._weeks, 6);
if (_time_datas._weeks_enable == 0)
SET_PIN(framev._weeks, 6);
printf("报警时钟星期=[%#X]\n", framev._weeks);
framev._hours = IntToBCD(_time_datas._hours);
printf("报警时钟小时[%d],_enable:=[%d]\n", _time_datas._hours, _time_datas._hours_enable);
if (_time_datas._hours_enable == 1)
SET_BIT(framev._hours, 7);
if (_time_datas._hours_enable == 0)
SET_PIN(framev._hours, 7);
printf("报警时钟小时=[%#X]\n", framev._hours);
framev._minutes = IntToBCD(_time_datas._minutes);
printf("报警时钟分[%d],_enable:=[%d]\n", _time_datas._minutes, _time_datas._minutes_enable);
if (_time_datas._minutes_enable == 1)
SET_BIT(framev._minutes, 7);
if (_time_datas._minutes_enable == 0)
SET_PIN(framev._minutes, 7);
printf("报警时钟分=[%#X]\n", framev._minutes);
framev._time_data[1] = framev._minutes;
framev._time_data[2] = framev._hours;
framev._time_data[5] = framev._weeks;
for (int i = 0; i < 11; i++)
printf("%.2X ", framev._time_data[i]);
static int i2c_write_bytes(int fd, uint8_t slave_addr, uint8_t reg_addr, uint8_t *values, uint8_t len)
struct i2c_rdwr_ioctl_data packets;
struct i2c_msg messages[1];
outbuf = (uint8_t *)malloc(len + 1);
printf("Error: No memory for buffer\n");
memcpy(outbuf + 1, values, len);
messages[0].addr = slave_addr;
messages[0].len = len + 1;
messages[0].buf = outbuf;
if (ioctl(fd, I2C_RDWR, &packets) < 0)
printf("Error: Unable to send data");
int Auto_Time_Set(time_datas _time_datas)
i2c_fd = open(I2C_BUS, O_RDWR);
perror("Failed to open I2C bus");
time_datas get_time_datas;
get_time_datas = gettimedate(_time_datas);
i2c_write_bytes(i2c_fd, ISL2108_ADDR, 0x0c, get_time_datas._time_data, len);
time_datas_V._hours_enable = 1;
time_datas_V._weeks_enable = 1;
time_datas_V._minutes = 03;
time_datas_V._minutes_enable = 1;
Auto_Time_Set(time_datas_V);

