Files
AC707N/SDK/cpu/periph_demo/iic_master_demo.c
T
2025-12-03 11:12:34 +08:00

97 lines
3.1 KiB
C

#ifdef SUPPORT_MS_EXTENSIONS
#pragma bss_seg(".iic_master_demo.data.bss")
#pragma data_seg(".iic_master_demo.data")
#pragma const_seg(".iic_master_demo.text.const")
#pragma code_seg(".iic_master_demo.text")
#endif
#include "clock.h"
#include "asm/wdt.h"
#define LOG_TAG "[iic_m_demo]"
#define LOG_ERROR_ENABLE
#define LOG_DEBUG_ENABLE
#define LOG_INFO_ENABLE
#define LOG_CLI_ENABLE
#include "debug.h"
#if 1 //0:软件iic, 1:硬件iic
#define _IIC_USE_HW
#endif
#include "iic_api.h"
/******************************iic master test*****************************/
#if 1
#define IIC_SCL_IO IO_PORTA_01
#define IIC_SDA_IO IO_PORTA_02
void iic_master_polling_test()
{
struct iic_master_config iic_config_test = {
.role = IIC_MASTER,
.scl_io = IIC_SCL_IO,
.sda_io = IIC_SDA_IO,
.io_mode = PORT_INPUT_PULLUP_10K,//上拉或浮空
.hdrive = PORT_DRIVE_STRENGT_2p4mA, //enum GPIO_HDRIVE 0:2.4MA, 1:8MA, 2:26.4MA, 3:40MA
.master_frequency = 100000, //软件iic频率不准(hz)
.io_filter = 1, //软件无效
.ie_en = 1,//1:注册中断
.irq_priority = 3,//优先级
};
//eeprom
#ifdef _IIC_USE_HW
log_info("**********************hw iic test*************************\n");
u8 eeprom_reg_addr = 56;
hw_iic_dev iic_dev = HW_IIC_0;
#else
log_info("**********************soft iic test*************************\n");
u8 eeprom_reg_addr = 64;
soft_iic_dev iic_dev = 0;
#endif
enum iic_state_enum iic_init_state = iic_init(iic_dev, &iic_config_test);
if (iic_init_state == IIC_OK) {
log_info("iic(%d) master init ok", iic_dev);
} else {
log_error("iic(%d) master init fail", iic_dev);
return;
}
u8 eeprom_wbuf[32], eeprom_rbuf[32];
u8 eeprom_dev_addr = 0xa0;
u8 eeprom_retry_cnt = 10;
int eeprom_ret_len = 0;
for (u8 i = 0; i < sizeof(eeprom_rbuf); i++) {
eeprom_wbuf[i] = i % 26 + 'a';
eeprom_rbuf[i] = 0;
}
eeprom_ret_len = i2c_master_read_nbytes_from_device_reg(iic_dev, eeprom_dev_addr, &eeprom_reg_addr, 1, eeprom_rbuf, 31);
log_info("%s,len:%d", eeprom_rbuf, eeprom_ret_len);
memset(eeprom_rbuf, 0, 32);
mdelay(20);
//cppcheck-suppress redundantAssignment
eeprom_ret_len = 0;
puts(">>>> write in\n");
while ((eeprom_ret_len != 8) && (--eeprom_retry_cnt)) {
eeprom_ret_len = i2c_master_write_nbytes_to_device_reg(iic_dev, eeprom_dev_addr, &eeprom_reg_addr, 1, eeprom_wbuf, 8);
}
puts("<<<< write out\n");
eeprom_retry_cnt = 10;
mdelay(20);
eeprom_ret_len = 0;
puts(">>>> read in\n");
while ((eeprom_ret_len != 31) && (--eeprom_retry_cnt)) {
eeprom_ret_len = i2c_master_read_nbytes_from_device_reg(iic_dev, eeprom_dev_addr, &eeprom_reg_addr, 1, eeprom_rbuf, 31);
}
puts("<<<< read out\n");
iic_init_state = iic_deinit(iic_dev);
if (iic_init_state == IIC_OK) {
log_info("iic(%d) master uninit ok", iic_dev);
} else {
log_error("iic(%d) master uninit fail", iic_dev);
}
log_info_hexdump(eeprom_rbuf, 32);
log_info("%s", eeprom_rbuf);
}
#endif