Hi guys
I am working on a project need to pass the ADS1231 read data through BLE. But I haven't done so far. I just try to read the ADS1231 value first. Referring to some source online, I have my data read functions as below, and they work fine without BLE environment.
/*
*** jousis's gitlab open source code for reference
*** <Scale FeatherWing>
*** https://gitlab.com/jousis/scale-featherwing/-/tree/master/Firmware/nRF52832/ScaleTest
*/
#include <stdint.h>
#include "ADS1231.h"
#define SCL_PIN 15
#define DOUT_PIN 16
#define SPEED_PIN 29
#define PWDN_PIN 7
void ADS1231_init(void){
// set scl_pin output
nrf_gpio_cfg_output(SCL_PIN);
// set dout_pin input
nrf_gpio_cfg_input(DOUT_PIN, NRF_GPIO_PIN_PULLUP);
// set pwdn_pin
nrf_gpio_cfg_output(PWDN_PIN);
// reset ADS1231
ADS1231_powerOn();
setSpeed(0); // should controled by
}
void ADS1231_powerOn(void){
nrf_gpio_pin_clear(PWDN_PIN); // make pwdn_pin low, to reset the ADC
nrf_delay_us ( 52 ); // Datasheet p15. At least 26us ( Security Factor: 2*26us = 52us )
nrf_gpio_pin_set(PWDN_PIN);
nrf_gpio_pin_clear(SCL_PIN); // initial state
// should be safeguarding
}
int32_t ADS1231_readADC(void){
int32_t adcvalue = 0, digit = 0;
int i=0;
for(i=0; i<24; i++){ // 24 pulses
nrf_gpio_pin_set(SCL_PIN);
nrf_delay_us(1);
digit = nrf_gpio_pin_read(DOUT_PIN);
adcvalue = (adcvalue << 1) + digit;
nrf_gpio_pin_clear(SCL_PIN);
nrf_delay_us(1);
}
nrf_gpio_pin_set(SCL_PIN); // keep dout high // 25th pulse
nrf_delay_us(1);
nrf_gpio_pin_clear(SCL_PIN);
// yield() to confirm dout is high
//adcvalue = (adcvalue << 8) / 256;
return adcvalue;
}
void setSpeed(uint8_t sps){
if(sps>0){
nrf_gpio_pin_set(SPEED_PIN);
}
else{
nrf_gpio_pin_clear(SPEED_PIN);
}
}
uint32_t * ADS1231_readADCbyte(void){
static int32_t value[24] = {0};
int i=0;
for(i=0; i<24; i++){ // 24 pulses
nrf_gpio_pin_set(SCL_PIN);
nrf_delay_us(1);
value[i] = nrf_gpio_pin_read(DOUT_PIN)+48;
nrf_gpio_pin_clear(SCL_PIN);
nrf_delay_us(1);
}
nrf_gpio_pin_set(SCL_PIN); // keep dout high // 25th pulse
nrf_delay_us(1);
nrf_gpio_pin_clear(SCL_PIN);
// yield() to confirm dout is high
//adcvalue = (adcvalue << 8) / 256;
return value;
}
main.c
int main(void)
{
uint32_t err_code;
APP_ERROR_CHECK(NRF_LOG_INIT(NULL));
//NRF_LOG_DEFAULT_BACKENDS_INIT();
bsp_board_init(BSP_INIT_LEDS);
uart_init();
ADS1231_init();
int32_t adcValue;
uint32_t* adcByte;
printf("\r\nUART example started.\r\n");
while (1)
{
#ifdef adcByte
adcByte = ADS1231_readADCbyte();
for(int i=0; i<24; i++){
while(app_uart_put(adcByte[i]));
//printf("%d", adcByte[i]);
}
printf("\r\n");
//printf("ADC value: %x", adcValue);
//NRF_LOG_FLUSH();
#else
adcValue = ADS1231_readADC();
printf("ADC value: %d\r\n", adcValue-load_cell_offset);
#endif
nrf_delay_ms(100);
}
}
Then I try to use timer interrupt to call the ADS1231_readADC()
#include "nrf_drv_spi.h"
#include "app_util_platform.h"
#include "nrf_gpio.h"
#include "nrf_delay.h"
#include "boards.h"
#include "app_error.h"
#include <string.h>
#include "nrf_log.h"
#include "nrf_log_ctrl.h"
#include "nrf_log_default_backends.h"
// ADS
#include "ADS1231.h"
// UART
#include "nrf.h"
#include "bsp.h"
#include "nrf_uart.h"
#include "nrf_uarte.h"
#include "app_uart.h"
// ISR
#include "app_timer.h"
#define MAX_TEST_DATA_BYTES (15U) /**< max number of test bytes to be used for tx and rx. */
#define UART_TX_BUF_SIZE 256 /**< UART TX buffer size. */
#define UART_RX_BUF_SIZE 256 /**< UART RX buffer size. */
#define UART_HWFC APP_UART_FLOW_CONTROL_DISABLED
#define load_cell_offset 0
APP_TIMER_DEF(ads1231_timer_id);
int8_t rx[100] = {0};
void uart_error_handle(app_uart_evt_t * p_event)
{
if (p_event->evt_type == APP_UART_COMMUNICATION_ERROR)
{
APP_ERROR_HANDLER(p_event->data.error_communication);
}
else if (p_event->evt_type == APP_UART_FIFO_ERROR)
{
APP_ERROR_HANDLER(p_event->data.error_code);
}
}
static void uart_init(void){
uint32_t err_code;
const app_uart_comm_params_t comm_params =
{
RX_PIN_NUMBER,
TX_PIN_NUMBER,
RTS_PIN_NUMBER,
CTS_PIN_NUMBER,
UART_HWFC,
false,
NRF_UART_BAUDRATE_115200
};
APP_UART_FIFO_INIT(&comm_params,
UART_RX_BUF_SIZE,
UART_TX_BUF_SIZE,
uart_error_handle,
APP_IRQ_PRIORITY_LOWEST,
err_code);
APP_ERROR_CHECK(err_code);
}
static void ads1231_timer_handler(void * p_context)
{
ret_code_t err_code;
//static uint32_t * ADC_data;
int32_t ADCValue;
//ADC_data = ADS1231_readADCbyte();
ADCValue = ADS1231_readADC();
printf("ADC value: %d",ADCValue);
}
static void timers_init(void)
{
// Initialize timer module.
ret_code_t err_code = app_timer_init();
APP_ERROR_CHECK(err_code);
// Create timers.
err_code = app_timer_create(&ads1231_timer_id, APP_TIMER_MODE_REPEATED, ads1231_timer_handler);
APP_ERROR_CHECK(err_code);
}
int main(void)
{
uint32_t err_code;
APP_ERROR_CHECK(NRF_LOG_INIT(NULL));
//NRF_LOG_DEFAULT_BACKENDS_INIT();
bsp_board_init(BSP_INIT_LEDS);
uart_init();
timers_init();
ADS1231_init();
err_code = app_timer_start(ads1231_timer_id, APP_TIMER_TICKS(100), NULL);
APP_ERROR_CHECK(err_code);
int32_t adcValue;
uint32_t* adcByte;
printf("\r\nUART example started.\r\n");
while (1)
{
}
}
The program can be compiled and run, the interrupt also worked. But I can't get the correct value from ADS1231. The clock cycles I made by ADS1231_readADC() didn't work, so all the data I get were in high mode. That means, normally ADS1231 has 24 bits data, and now they were all in 1 mode.
I guess the problem may caused by the timer confliction, but I am not sure about it. Please give me some guide. This is my first nRF52832 project, I have really no idea how to deal with this problem. Thank you very much.