Added I2C impl.
continuous-integration/drone/push Build is passing Details

Signed-off-by: Yilin Sun <imi415@imi.moe>
This commit is contained in:
Yilin Sun 2023-05-28 23:35:32 +08:00
parent 07453e8405
commit 0b44bc5754
Signed by: imi415
GPG Key ID: 17F01E106F9F5E0A
10 changed files with 231 additions and 2 deletions

View File

@ -14,4 +14,4 @@ steps:
commands:
- mkdir build && cd build
- cmake -DCMAKE_TOOLCHAIN_FILE=arm-none-eabi.cmake ..
- make
- make at32f437_mpyate_host_FLASH.elf

View File

@ -1,6 +1,6 @@
cmake_minimum_required(VERSION 3.10)
project(at32f437_start_template)
project(at32f437_mpyate_host)
enable_language(CXX)
enable_language(ASM)
@ -40,8 +40,10 @@ set(TARGET_SOURCES
"SDK/libraries/drivers/src/at32f435_437_wdt.c"
"SDK/libraries/drivers/src/at32f435_437_wwdt.c"
"SDK/libraries/drivers/src/at32f435_437_xmc.c"
"SDK/middlewares/i2c_application_library/i2c_application.c"
"board/at32f435_437_board.c"
"board/at32f435_437_clock.c"
"src/app_ate_impl.c"
"src/main.c"
)
@ -54,12 +56,14 @@ set(TARGET_C_INCLUDES
"SDK/libraries/cmsis/cm4/core_support"
"SDK/libraries/cmsis/cm4/device_support"
"SDK/libraries/drivers/inc"
"SDK/middlewares/i2c_application_library"
"board"
"include"
)
# Shared libraries linked with application
set(TARGET_LIBS
"mpyate_host"
"c"
"m"
"nosys"
@ -87,6 +91,8 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -fno-common -fno-builtin -f
set(CMAKE_ASM_FLAGS "${CMAKE_C_FLAGS} -x assembler-with-cpp")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gc-sections")
add_subdirectory(lib/mpyate)
# Shared sources, includes and definitions
add_compile_definitions(${TARGET_C_DEFINES})
include_directories(${TARGET_C_INCLUDES})

3
README.md Normal file
View File

@ -0,0 +1,3 @@
# MPyATE Host
[![Build Status](https://ci.minori.work/api/badges/imi415/Artery_AT32F437_Start_MPyATE_Host/status.svg)](https://ci.minori.work/imi415/Artery_AT32F437_Start_MPyATE_Host)

10
include/app_ate_impl.h Normal file
View File

@ -0,0 +1,10 @@
#ifndef APP_ATE_IMPL_H
#define APP_ATE_IMPL_H
#include "mpyate_host.h"
void ate_impl_i2c_init(void);
ate_ret_t ate_impl_i2c_read(void *handle, uint8_t *data, uint8_t len);
ate_ret_t ate_impl_i2c_write(void *handle, uint8_t *data, uint8_t len);
#endif // APP_ATE_IMPL_H

14
lib/mpyate/CMakeLists.txt Normal file
View File

@ -0,0 +1,14 @@
cmake_minimum_required(VERSION 3.10)
project(mpyate_host)
set(ATE_HOST_SRCS
"src/mpyate_host.c"
)
set(ATE_HOST_INCLUDES
"include"
)
add_library(${PROJECT_NAME} ${ATE_HOST_SRCS})
target_include_directories(${PROJECT_NAME} PUBLIC ${ATE_HOST_INCLUDES})

View File

@ -0,0 +1,27 @@
#ifndef MPYATE_HOST_H
#define MPYATE_HOST_H
#include <stdint.h>
typedef enum {
ATE_RET_SUCCESS,
ATE_RET_FAIL,
} ate_ret_t;
typedef ate_ret_t (*ate_i2c_read_t)(void *handle, uint8_t *data, uint8_t len);
typedef ate_ret_t (*ate_i2c_write_t)(void *handle, uint8_t *data, uint8_t len);
typedef struct {
ate_i2c_read_t read;
ate_i2c_write_t write;
} ate_ops_t;
typedef struct {
ate_ops_t ops;
void *user_data;
} ate_t;
ate_ret_t ate_init(ate_t *ate);
#endif // MPYATE_HOST_H

View File

@ -0,0 +1,11 @@
#ifndef MPYATE_COMMANDS_H
#define MPYATE_COMMANDS_H
#define ATE_REG_CTRL 0x00U
#define ATE_REG_VER 0xFEU
#define ATE_REG_ID 0xFFU
#define ATE_REG_CTRL_RST_Pos 15
#define ATe_REG_CTRL_RST_Msk (1U << ATE_REG_CTRL_RST_Pos)
#endif // MPYATE_COMMANDS_H

View File

@ -0,0 +1,68 @@
#include "mpyate_host.h"
#include "private/mpyate_regs.h"
#define ATE_COMPONENT_ID 0xEACE
static ate_ret_t ate_read_id(ate_t *ate, uint16_t *id);
static ate_ret_t ate_read_register(ate_t *ate, uint8_t reg, uint16_t *data);
static ate_ret_t ate_write_register(ate_t *ate, uint8_t reg, uint16_t data);
ate_ret_t ate_init(ate_t *ate) {
ate_ret_t ret = ATE_RET_SUCCESS;
uint16_t id;
ret = ate_read_id(ate, &id);
if (ret != ATE_RET_SUCCESS) {
return ret;
}
if (id != ATE_COMPONENT_ID) {
ret = ATE_RET_FAIL;
}
return ret;
}
static ate_ret_t ate_read_id(ate_t *ate, uint16_t *id) {
return ate_read_register(ate, ATE_REG_ID, id);
}
static ate_ret_t ate_read_register(ate_t *ate, uint8_t reg, uint16_t *data) {
ate_ret_t ret = ATE_RET_SUCCESS;
uint8_t tx_data[2] = {reg, 0x00};
uint8_t rx_data[2] = {0x00, 0x00};
ret = ate->ops.write(ate->user_data, tx_data, 0x01);
if (ret != ATE_RET_SUCCESS) {
return ret;
}
ret = ate->ops.read(ate->user_data, rx_data, 2);
if (ret != ATE_RET_SUCCESS) {
return ret;
}
*data = rx_data[1] << 8U | rx_data[0];
return ret;
}
static ate_ret_t ate_write_register(ate_t *ate, uint8_t reg, uint16_t data) {
ate_ret_t ret = ATE_RET_SUCCESS;
uint8_t tx_data[3] = {reg, 0x00, 0x00};
tx_data[1] = data & 0xFFU;
tx_data[2] = (data >> 8U) & 0xFFU;
ret = ate->ops.write(ate->user_data, tx_data, 0x03);
if (ret != ATE_RET_SUCCESS) {
return ret;
}
return ret;
}

62
src/app_ate_impl.c Normal file
View File

@ -0,0 +1,62 @@
/* 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;
}
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, 0x80504C4E);
i2c_own_address1_set(I2C1, I2C_ADDRESS_MODE_7BIT, 0xA0);
}
}

View File

@ -1,9 +1,37 @@
#include <stdio.h>
/* SDK drivers */
#include "at32f435_437_board.h"
#include "at32f435_437_clock.h"
#include "at32f435_437_i2c.h"
/* ATE */
#include "app_ate_impl.h"
static ate_t s_ate = {
.ops =
{
.read = ate_impl_i2c_read,
.write = ate_impl_i2c_write,
},
};
int main(void) {
system_clock_config();
at32_board_init();
uart_print_init(115200);
ate_impl_i2c_init();
if (ate_init(&s_ate) != ATE_RET_SUCCESS) {
printf("Failed to initialize ATE.\r\n");
goto dead_loop;
}
printf("ATE initialized.\r\n");
dead_loop:
for (;;) {
/* -- */