目前,我正在探索 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 集成代码来帮助我。
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 表文档。