97 lines
3.1 KiB
C
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
|
|
|