There are 3 main folders in the project:
- BMLite_examples - HW-independed application examples
- BMLite_sdk - FPC BM-Lite SDK
- HAL_Driver - implementation of HW-dependent functions
There are some variables controlling application building:
APP - defines application PLATFORM - defines HW plaform with HAL implementation DEBUG - if defined as 'y' will produce debug output and add debug information PORT - if defined as UART, BM-Lite HAL will use UART interface. Else will use SPI interface
Not all applications can be built for a particular platform. To build embedded application for nRF52840 platform with additional debug info use:
make APP=embedded_app PLATFORM=nRF52840 DEBUG=y
There are some useful makefile targets:
- Show all available applications:
make list_apps
- Show all available platforms:
make list_hals
- Clean output for particular application and platform:
make PLATFORM=nRF52840 APP=embedded_app clean
- Clean output for all applications and platforms:
make clean_all
Platform-independent interface implemented in platform.c
Platform function | Description |
---|---|
fpc_bep_result_t platform_init(void *params) | Initilalizes hardware |
void platform_bmlite_reset(void) | Implements BM-Lite HW Reset |
fpc_bep_result_t platform_bmlite_spi_send(uint16_t size, const uint8_t *data, uint32_t timeout) fpc_bep_result_t platform_bmlite_uart_send(uint16_t size, const uint8_t *data, uint32_t timeout) | Send data packet to FPC BM-Lite |
fpc_bep_result_t platform_bmlite_spi_receive(uint16_t size, uint8_t *data, uint32_t timeout) fpc_bep_result_t platform_bmlite_uart_receive(uint16_t size, uint8_t *data, uint32_t timeout) | Receive data packet from FPC BM-Lite. If timeout = 0, the function will wait for data from BM-Lite indefinitely. The waiting loop will be breaked if hal_check_button_pressed() returns non-zero value. It is recommended to do HW or SW reset of BM-Lite if platform_bmlite_spi_receive() returns **FPC_BEP_RESULT_TIMEOUT** in order to return is into known state. |
For UART interface IRQ/READY pin is not used, so in UART mode there is no signal from FPC-BM-Lite indicating that BM-Lite is going to send data. To avoid data loss, all data received from UART must be stored into an incoming circular buffer. I would recommend to use UART interrupt or DMA to receive data from UART and store it to the buffer. platform_bmlite_uart_receive() will read from that buffer when HCP protocol requests to read a data block. Activation UART data reading only inside platform_bmlite_uart_receive() will lead to loosing incoming data and causing HCP protocol errors.
For porting the project to a new microcontroller, all functions from bmlite_hal.h should be implemented.
HAL Function | Description |
---|---|
fpc_bep_result_t hal_board_init(void *params) | Initialize GPIO, System timer, SPI |
void hal_bmlite_reset(bool state) | Activate/Deactivate BM-Lite RST_N pin (Active Low) |
fpc_bep_result_t hal_bmlite_spi_write_read(uint8_t *write, uint8_t *read, size_t size, bool leave_cs_asserted) | SPI data exchange |
size_t hal_bmlite_uart_write(const uint8_t *data, size_t size); | Write data to UART interface |
size_t hal_bmlite_uart_read(uint8_t *buff, size_t size); | Read data from UART interface |
bool hal_bmlite_get_status(void) | Return status of BM-Lite IRQ pin (Active High) |
void hal_timebase_init(void) | Initialize system clock with 1 msec tick |
uint32_t hal_timebase_get_tick(void) | Read currect system clock value |
void hal_timebase_busy_wait(uint32_t ms) | Delay for ms msec |
HAL Function | Description |
---|---|
uint32_t hal_get_button_press_time(void) | How long UI button was pressed last time. Also it should reset button pressed time counter |
uint32_t hal_check_button_pressed(void) | Used for breaking waiting in platform_bmlite_spi_receive() if returns non-zero |
void hal_set_leds(platform_led_status_t status, uint16_t mode) | Set LED(s) state according to status and mode. |
- BM-Lite support both UART and SPI communication interface. BM-Lite automatically detects the specific communication interface in use. However, it is not possible to use both interfaces at the same time!
- IRQ pin is used in SPI mode only as FPC BM-Lite Ready-to-Transmit signal. The module set it to High when it has some data to send and set it to Low when data packet is sent.