支持需要使用外部传感器与ASR6601单片机进行SPI通信

问题描述 投票:0回答:1

目前,我正在探索 ASR6601 微控制器,它是一款通用 LPWAN 无线通信 SoC。 其中,我专门致力于 SPI 和 I2S 外部传感器与 AS6601SE 控制器的集成。

对于 SPI/SSP, 我尝试使用 git hub 中给出的 asr_lora_6601-master 基本示例进行探索。根据我的理解,它正在将数据传输到SSPx数据寄存器,并从传输过程中发送的SPI数据寄存器接收相同的数据。 以此为参考,我尝试将 ADX345 传感器与 AS6601SE 控制器集成,但无法与从站(ADXL345 传感器)建立正确的通信。 我在读取 sis 连续寄存器时获得所有 Rx 缓冲区的常量值。我已将输出屏幕截图附在附件中。请浏览一次。 我已将相同的 ADXL345 传感器与 STM32 和 RAK 等其他控制器集成。在此过程中,我使用 HAL 驱动程序获得了 SPI 集成的正确输出。 但这里都是基于tremo驱动,相对于HAL库来说有点困难。

希望得到您的积极答复!如果可能,请通过使用外部传感器与 ASR6601SE 共享与应用程序相关的 SPI 集成代码来帮助我。

我已附加在主文件中完成的代码行。如果我在这方面做错了什么,请纠正。 ADXL345 与 ASR6601SE 集成源代码。我这里没有使用任何中断方法。我只是使用连续轮询读取。

#include <stdio.h>
#include "tremo_regs.h"
#include "tremo_rcc.h"
#include "tremo_spi.h"
#include "tremo_gpio.h"
#include <stdarg.h>
#include "tremo_uart.h"
#include "tremo_delay.h"

#define SPI_X     SSP1


void uart_log_init(void);

void SPITransf(uint8_t addr, uint8_t data);
void SPIReceive(uint8_t addr, uint8_t size);

uint8_t spi1_rx_data[6] = {0};


void spi0_tx_rx(void)
{
  rcc_enable_peripheral_clk(RCC_PERIPHERAL_SSP1, true);


  ssp_init_t init_struct;

  ssp_init_struct(&init_struct);

  ssp_init(SPI_X, &init_struct);

  ssp_cmd(SPI_X, ENABLE);

  SPITransf(0x2D, 0);    // For reseting power control register in slave's power control register
  delay_ms(100);
  SPITransf(0x2D, 8);    // For setting the measurement mode in slave's power control register
  delay_ms(100);
  SPITransf(0x31, 1);    // For setting range as +/- 4g in slave's data format register
  delay_ms(100);
}

int main(void)
{
  rcc_enable_peripheral_clk(RCC_PERIPHERAL_GPIOB, true);
  rcc_enable_peripheral_clk(RCC_PERIPHERAL_UART0, true);
  uart_log_init();

  gpio_init(GPIOB, GPIO_PIN_9, GPIO_MODE_OUTPUT_PP_HIGH);
  gpio_write(GPIOB, GPIO_PIN_9, GPIO_LEVEL_HIGH);

  gpio_set_iomux(GPIOB, GPIO_PIN_8, 4);  // CLK:GP24
  //gpio_set_iomux(GPIOB, GPIO_PIN_9, 4);  // NSS:GP25
  gpio_set_iomux(GPIOB, GPIO_PIN_10, 4); // TX:GP26
  gpio_set_iomux(GPIOB, GPIO_PIN_11, 4); // RX:GP27

  /* Infinite loop */
  while (1) {
    spi0_tx_rx();   // for initializing the SPI
    delay_us(20);
    gpio_write(GPIOB, GPIO_PIN_9, GPIO_LEVEL_LOW);
    delay_us(20);
    SPIReceive(0x32, 6);      // For reading the continuous 6 data register from ADXL slave
    for (int i = 0; i < 6; i++) {
      printf("ssp_Receive_data[%d], 0x%x\r\n", i, spi1_rx_data[i]);
    }

    delay_us(20);
    ssp_cmd(SPI_X, DISABLE);
    ssp_deinit(SPI_X);        // for De-initializing the SPI
    delay_ms(5000);
  }
}


void uart_log_init(void)
{
  // uart0
  gpio_set_iomux(GPIOB, GPIO_PIN_0, 1);  // UART0  Tx
  gpio_set_iomux(GPIOB, GPIO_PIN_1, 1);  // UART0  Rx

  /* uart config struct init */
  uart_config_t uart_config;
  uart_config_init(&uart_config);

  uart_config.baudrate = UART_BAUDRATE_115200;

  uart_init(UART0, &uart_config);  // CONFIG_DEBUG_UART = UART0
  uart_cmd(UART0, ENABLE);
}
void SPITransf(uint8_t addr, uint8_t data)
{
  uint8_t txarr[2] = {0};
  addr |= 0x40;  // multibyte read
  txarr[0] = addr;
  txarr[1] = data;
  gpio_write(GPIOB, GPIO_PIN_9, GPIO_LEVEL_LOW);
  delay_us(20);
  ssp_send_data(SPI_X, txarr , sizeof (txarr));
  for (int i = 0; i < sizeof (txarr); i++) {
    printf("SendData[%d], 0x%x\r\n", i, txarr[i]);
  }
  gpio_write(GPIOB, GPIO_PIN_9, GPIO_LEVEL_HIGH);
}

void  SPIReceive(uint8_t addr, uint8_t size )
{
  uint8_t  rxarr[1] = {0};
  addr |= 0x80;  // read operation
  addr |= 0x40;  // multibyte read
  rxarr[0] = addr;
  gpio_write(GPIOB, GPIO_PIN_9, GPIO_LEVEL_LOW);
  delay_us(20);
  ssp_send_data(SPI_X, rxarr , 1);
  ssp_receive_data(SPI_X, spi1_rx_data , size);
  gpio_write(GPIOB, GPIO_PIN_9, GPIO_LEVEL_HIGH);
}

#ifdef USE_FULL_ASSERT
void assert_failed(void* file, uint32_t line)
{
  (void)file;
  (void)line;

  while (1) { }
}
#endif

输出:文本

[21:34:28.982] SendData[0], 0x6d
SendData[1], 0x0
[21:34:29.094] SendData[0], 0x6d
SendData[1], 0x8
[21:34:29.189] SendData[0], 0x71
SendData[1], 0x1
[21:34:29.313] ssp_Receive_data[0], 0xc1
ssp_Receive_data[1], 0xc1
ssp_Receive_data[2], 0xc1
ssp_Receive_data[3], 0xc1
ssp_Receive_data[4], 0xc1
ssp_Receive_data[5], 0xc1
[21:34:34.323] SendData[0], 0x6d
SendData[1], 0x0
[21:34:34.435] SendData[0], 0x6d
SendData[1], 0x8
[21:34:34.530] SendData[0], 0x71
SendData[1], 0x1
[21:34:34.654] ssp_Receive_data[0], 0xfd
ssp_Receive_data[1], 0xfd
ssp_Receive_data[2], 0xfd
ssp_Receive_data[3], 0xfd
ssp_Receive_data[4], 0xfd
ssp_Receive_data[5], 0xfd
[21:34:39.666] SendData[0], 0x6d
SendData[1], 0x0
[21:34:39.777] SendData[0], 0x6d
SendData[1], 0x8
[21:34:39.872] SendData[0], 0x71
SendData[1], 0x1
[21:34:39.997] ssp_Receive_data[0], 0xfd
ssp_Receive_data[1], 0xfd
ssp_Receive_data[2], 0xfd
ssp_Receive_data[3], 0xfd
ssp_Receive_data[4], 0xfd
ssp_Receive_data[5], 0xfd
[21:34:45.009] SendData[0], 0x6d
SendData[1], 0x0
[21:34:45.104] SendData[0], 0x6d
SendData[1], 0x8
[21:34:45.216] SendData[0], 0x71
SendData[1], 0x1
[21:34:45.312] ssp_Receive_data[0], 0x2
ssp_Receive_data[1], 0x2
ssp_Receive_data[2], 0x2
ssp_Receive_data[3], 0x2
ssp_Receive_data[4], 0x2
ssp_Receive_data[5], 0x2
[21:34:50.351] SendData[0], 0x6d
SendData[1], 0x0
[21:34:50.448] SendData[0], 0x6d
SendData[1], 0x8
[21:34:50.559] SendData[0], 0x71
SendData[1], 0x1
[21:34:50.656] ssp_Receive_data[0], 0xfa
ssp_Receive_data[1], 0xfa
ssp_Receive_data[2], 0xfa
ssp_Receive_data[3], 0xfa
ssp_Receive_data[4], 0xfa
ssp_Receive_data[5], 0xfa
[21:34:55.687] SendData[0], 0x6d
SendData[1], 0x0
[21:34:55.798] SendData[0], 0x6d
SendData[1], 0x8
[21:34:55.894] SendData[0], 0x71
SendData[1], 0x1
[21:34:56.019] ssp_Receive_data[0], 0x1c
ssp_Receive_data[1], 0x1c
ssp_Receive_data[2], 0x1c
ssp_Receive_data[3], 0x1c
ssp_Receive_data[4], 0x1c
ssp_Receive_data[5], 0x1c
[21:35:01.029] SendData[0], 0x6d
SendData[1], 0x0
[21:35:01.140] SendData[0], 0x6d
SendData[1], 0x8
[21:35:01.236] SendData[0], 0x71
SendData[1], 0x1
[21:35:01.360] ssp_Receive_data[0], 0x11
ssp_Receive_data[1], 0x11
ssp_Receive_data[2], 0x11
ssp_Receive_data[3], 0x11
ssp_Receive_data[4], 0x11
ssp_Receive_data[5], 0x11

纠正我,如果我在上述代码中做错了什么。 我已附上共享代码的输出屏幕截图。 如果可能,请通过使用外部传感器与 ASR6601SE 共享与应用程序相关的 SPI 集成代码来帮助我。

c embedded spi serial-communication
1个回答
0
投票

GP25 引脚似乎缺少 gpio_set_iomux() 调用? //gpio_set_iomux(GPIOB, GPIO_PIN_9, 4); // NSS:GP25

如果您想以编程方式控制 GP25 引脚,您应该按如下方式初始化它: gpio_set_iomux(GPIOB, GPIO_PIN_9, 0); // 0 -> fun=0,参见 Ai-ThinkerRa-08 GPIO 功能 MUX 表文档。

© www.soinside.com 2019 - 2024. All rights reserved.