Artery_AT32F437_Start_MPyAT.../src/app_ate_impl.c

68 lines
1.9 KiB
C

/* SDK drivers */
#include "at32f435_437_board.h"
#include "at32f435_437_clock.h"
#include "at32f435_437_i2c.h"
/* Middleware */
#include "i2c_application.h"
/* ATE */
#include "app_ate_impl.h"
#define APP_ATE_I2C_ADDR (0x28U)
#define APP_ATE_I2C_ADDR_W (APP_ATE_I2C_ADDR << 1U)
#define APP_ATE_I2C_ADDR_R ((APP_ATE_I2C_ADDR << 1U) | 0x01U)
static i2c_handle_type s_i2c_handle = {
.i2cx = I2C1,
};
void ate_impl_i2c_init(void) {
i2c_config(&s_i2c_handle);
}
ate_ret_t ate_impl_i2c_read(void *handle, uint8_t *data, uint8_t len) {
if (i2c_master_receive(&s_i2c_handle, APP_ATE_I2C_ADDR_R, data, len, 0xFFFFFFFF) != I2C_OK) {
return ATE_RET_FAIL;
}
return ATE_RET_SUCCESS;
}
ate_ret_t ate_impl_i2c_write(void *handle, uint8_t *data, uint8_t len) {
if (i2c_master_transmit(&s_i2c_handle, APP_ATE_I2C_ADDR_W, data, len, 0xFFFFFFFF) != I2C_OK) {
return ATE_RET_FAIL;
}
return ATE_RET_SUCCESS;
}
ate_ret_t ate_impl_delay(void *handle, uint32_t msec) {
delay_ms(msec);
return ATE_RET_SUCCESS;
}
void i2c_lowlevel_init(i2c_handle_type *handle) {
if (handle->i2cx == I2C1) {
crm_periph_clock_enable(CRM_I2C1_PERIPH_CLOCK, TRUE);
crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
/* I2C1: PB8/PB9 */
gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE8, GPIO_MUX_4);
gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE9, GPIO_MUX_4);
gpio_init_type pin_cfg = {
.gpio_pins = GPIO_PINS_8 | GPIO_PINS_9,
.gpio_mode = GPIO_MODE_MUX,
.gpio_out_type = GPIO_OUTPUT_OPEN_DRAIN,
.gpio_pull = GPIO_PULL_NONE,
.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER,
};
gpio_init(GPIOB, &pin_cfg);
/* Magic number: timing register value */
i2c_init(I2C1, 0x0F, 0x30F03C6B);
i2c_own_address1_set(I2C1, I2C_ADDRESS_MODE_7BIT, 0xA0);
}
}