#define CM_RESP_TIME_OUT (3)
时间: 2024-06-19 17:03:12 浏览: 13
`#define CM_RESP_TIME_OUT (3)` 是一个宏定义,它定义了一个名为 `CM_RESP_TIME_OUT` 的常量,并将其值设为 3。在程序中使用 `CM_RESP_TIME_OUT` 可以代替直接使用数字 3,使得程序更加易于维护和修改。这个宏定义的含义是某个操作的超时时间为 3 秒。
如果在程序中需要多次使用相同的超时时间,可以使用宏定义来避免多次输入相同的数字。另外,如果需要修改超时时间,只需要修改宏定义的值即可,而不需要在程序中搜索每一个使用到超时时间的地方进行修改。
相关问题
使用stm32f407vet6的SPI1接口接ADS131A04芯片,使用PA3作为DRDY引脚,写出ADS131A04的驱动程序
好的,以下是基于HAL库的ADS131A04驱动程序示例:
```c
#include "stm32f4xx_hal.h"
#define ADS131A04_SPI_TIMEOUT 1000
/* ADS131A04命令字 */
#define CMD_WAKEUP 0x02
#define CMD_STANDBY 0x04
#define CMD_RESET 0x06
#define CMD_START 0x08
#define CMD_STOP 0x0A
#define CMD_RDATA 0x12
#define CMD_RDATAC 0x14
#define CMD_SDATAC 0x16
#define CMD_RREG 0x20
#define CMD_WREG 0x40
/* ADS131A04寄存器地址 */
#define REG_ID 0x00
#define REG_CONFIG1 0x01
#define REG_CONFIG2 0x02
#define REG_CONFIG3 0x03
#define REG_CH1SET 0x04
#define REG_CH2SET 0x05
#define REG_CH3SET 0x06
#define REG_CH4SET 0x07
#define REG_CH5SET 0x08
#define REG_CH6SET 0x09
#define REG_CH7SET 0x0A
#define REG_CH8SET 0x0B
#define REG_RLD_SENSP 0x0C
#define REG_RLD_SENSN 0x0D
#define REG_LOFF 0x0E
#define REG_RESP1 0x10
#define REG_RESP2 0x11
/* ADS131A04寄存器值 */
#define CONFIG1_VAL 0x30 // 采样率2KSPS,无功率线干扰滤波器
#define CONFIG2_VAL 0x00 // 正常功率线频率
#define CONFIG3_VAL 0x00 // 内部参考电压
#define CHNSET_VAL 0x00 // 缺省通道设置,单端,增益1
/* ADS131A04引脚定义 */
#define DRDY_PIN GPIO_PIN_3
#define DRDY_PORT GPIOA
/* ADS131A04寄存器读写函数 */
static uint8_t ADS131A04_ReadReg(SPI_HandleTypeDef *hspi, uint8_t reg)
{
uint8_t txbuf[2] = {CMD_RREG | reg, 0x00};
uint8_t rxbuf[2] = {0x00, 0x00};
HAL_GPIO_WritePin(DRDY_PORT, DRDY_PIN, GPIO_PIN_SET); // 关闭DRDY中断
HAL_SPI_TransmitReceive(hspi, txbuf, rxbuf, 2, ADS131A04_SPI_TIMEOUT);
HAL_GPIO_WritePin(DRDY_PORT, DRDY_PIN, GPIO_PIN_RESET); // 重新打开DRDY中断
return rxbuf[1];
}
static void ADS131A04_WriteReg(SPI_HandleTypeDef *hspi, uint8_t reg, uint8_t val)
{
uint8_t txbuf[2] = {CMD_WREG | reg, val};
HAL_GPIO_WritePin(DRDY_PORT, DRDY_PIN, GPIO_PIN_SET); // 关闭DRDY中断
HAL_SPI_Transmit(hspi, txbuf, 2, ADS131A04_SPI_TIMEOUT);
HAL_GPIO_WritePin(DRDY_PORT, DRDY_PIN, GPIO_PIN_RESET); // 重新打开DRDY中断
}
/* ADS131A04控制函数 */
void ADS131A04_Init(SPI_HandleTypeDef *hspi)
{
// 等待ADS131A04上电稳定
HAL_Delay(10);
// 复位ADS131A04
ADS131A04_WriteReg(hspi, REG_CONFIG1, CMD_RESET);
HAL_Delay(100); // 复位后需要一定时间恢复
// 设置ADS131A04采样率和滤波器
ADS131A04_WriteReg(hspi, REG_CONFIG1, CONFIG1_VAL);
ADS131A04_WriteReg(hspi, REG_CONFIG2, CONFIG2_VAL);
ADS131A04_WriteReg(hspi, REG_CONFIG3, CONFIG3_VAL);
// 配置通道设置
ADS131A04_WriteReg(hspi, REG_CH1SET, CHNSET_VAL);
ADS131A04_WriteReg(hspi, REG_CH2SET, CHNSET_VAL);
ADS131A04_WriteReg(hspi, REG_CH3SET, CHNSET_VAL);
ADS131A04_WriteReg(hspi, REG_CH4SET, CHNSET_VAL);
// 退出SDATAC模式
ADS131A04_WriteReg(hspi, REG_CONFIG1, CMD_RDATAC);
}
void ADS131A04_Start(SPI_HandleTypeDef *hspi)
{
ADS131A04_WriteReg(hspi, REG_CONFIG1, CMD_START);
}
void ADS131A04_Stop(SPI_HandleTypeDef *hspi)
{
ADS131A04_WriteReg(hspi, REG_CONFIG1, CMD_STOP);
}
void ADS131A04_ReadData(SPI_HandleTypeDef *hspi, uint8_t *rxbuf, uint32_t len)
{
uint8_t txbuf[1] = {CMD_RDATA};
// 关闭DRDY中断
HAL_GPIO_WritePin(DRDY_PORT, DRDY_PIN, GPIO_PIN_SET);
// 发送读取数据命令
HAL_SPI_Transmit(hspi, txbuf, 1, ADS131A04_SPI_TIMEOUT);
// 读取数据
HAL_SPI_Receive(hspi, rxbuf, len, ADS131A04_SPI_TIMEOUT);
// 重新打开DRDY中断
HAL_GPIO_WritePin(DRDY_PORT, DRDY_PIN, GPIO_PIN_RESET);
}
uint8_t ADS131A04_ReadStatus(SPI_HandleTypeDef *hspi)
{
return ADS131A04_ReadReg(hspi, REG_CONFIG1);
}
```
需要注意的是,该代码中使用PA3作为DRDY引脚,需要在初始化时将其配置为输入模式,并开启外部中断。在中断服务函数中,应当更新数据缓冲区并处理数据。
NB-IOT硬件驱动开发代码
NB-IoT硬件驱动开发代码的实现过程与具体的硬件平台和NB-IoT模组有关,下面是一份基于 STM32 平台和SIMCom SIM7020E模组的NB-IoT硬件驱动开发代码,供参考:
1. 硬件接口定义:
```c
/* 串口接口定义 */
#define NB_UART USART1
#define NB_UART_CLK RCC_APB2Periph_USART1
#define NB_UART_CLK_CMD RCC_APB2PeriphClockCmd
#define NB_UART_IRQn USART1_IRQn
#define NB_UART_IRQHandler USART1_IRQHandler
#define NB_UART_TX_PIN GPIO_Pin_9
#define NB_UART_RX_PIN GPIO_Pin_10
#define NB_UART_GPIO GPIOA
#define NB_UART_GPIO_CLK RCC_APB2Periph_GPIOA
/* GPIO接口定义 */
#define NB_PWRKEY_PIN GPIO_Pin_1
#define NB_PWRKEY_GPIO GPIOB
#define NB_PWRKEY_GPIO_CLK RCC_APB2Periph_GPIOB
#define NB_PWRKEY_HIGH() GPIO_SetBits(NB_PWRKEY_GPIO, NB_PWRKEY_PIN)
#define NB_PWRKEY_LOW() GPIO_ResetBits(NB_PWRKEY_GPIO, NB_PWRKEY_PIN)
#define NB_STATUS_PIN GPIO_Pin_0
#define NB_STATUS_GPIO GPIOB
#define NB_STATUS_GPIO_CLK RCC_APB2Periph_GPIOB
#define NB_STATUS_READ() GPIO_ReadInputDataBit(NB_STATUS_GPIO, NB_STATUS_PIN)
```
2. 驱动程序编写:
(1)初始化NB-IOT模组
```c
void nb_init(void)
{
/* 使能UART和GPIO时钟 */
RCC_APB2PeriphClockCmd(NB_UART_CLK | NB_UART_GPIO_CLK | NB_PWRKEY_GPIO_CLK | NB_STATUS_GPIO_CLK, ENABLE);
/* 配置UART引脚 */
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = NB_UART_TX_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(NB_UART_GPIO, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = NB_UART_RX_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(NB_UART_GPIO, &GPIO_InitStructure);
/* 配置GPIO引脚 */
GPIO_InitStructure.GPIO_Pin = NB_PWRKEY_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(NB_PWRKEY_GPIO, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = NB_STATUS_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(NB_STATUS_GPIO, &GPIO_InitStructure);
/* 复位NB-IOT模组 */
NB_PWRKEY_LOW();
delay_ms(100);
NB_PWRKEY_HIGH();
delay_ms(5000);
}
```
(2)发送AT指令
```c
uint8_t nb_send_at_cmd(char *cmd, char *resp, uint16_t timeout)
{
uint8_t i = 0, j = 0;
uint8_t ret = 0;
char rx_buf[256] = {0};
uint32_t t1 = 0, t2 = 0;
/* 发送AT指令 */
USART_ITConfig(NB_UART, USART_IT_RXNE, DISABLE);
USART_ITConfig(NB_UART, USART_IT_TC, ENABLE);
while (cmd[i] != '\0')
{
USART_SendData(NB_UART, (uint16_t)cmd[i++]);
while (USART_GetFlagStatus(NB_UART, USART_FLAG_TC) == RESET);
}
/* 等待模组应答 */
USART_ITConfig(NB_UART, USART_IT_TC, DISABLE);
USART_ITConfig(NB_UART, USART_IT_RXNE, ENABLE);
t1 = millis();
while ((millis() - t1) < timeout)
{
if (USART_GetFlagStatus(NB_UART, USART_FLAG_RXNE) == SET)
{
rx_buf[j++] = (char)USART_ReceiveData(NB_UART);
}
if (strstr(rx_buf, resp) != NULL)
{
ret = 1;
break;
}
}
return ret;
}
```
(3)数据收发
```c
void nb_send_data(uint8_t *data, uint16_t len)
{
/* 发送数据 */
char cmd[64] = {0};
sprintf(cmd, "AT+NMGS=%d,%02X", len, data[0]);
nb_send_at_cmd(cmd, "OK", 2000);
memset(cmd, 0, sizeof(cmd));
for (uint16_t i = 0; i < len; i++)
{
sprintf(cmd + strlen(cmd), "%02X", data[i]);
}
nb_send_at_cmd(cmd, "OK", 2000);
}
uint16_t nb_recv_data(uint8_t *data)
{
/* 接收数据 */
char cmd[64] = {0};
nb_send_at_cmd("AT+NMGR=1", "+NMGR:", 2000);
char *ptr = strstr((char *)nb_rx_buf, ",");
ptr++;
uint16_t len = 0;
sscanf(ptr, "%02X", &len);
ptr += 2;
for (uint16_t i = 0; i < len; i++)
{
sscanf(ptr + i * 2, "%02X", (unsigned int *)(data + i));
}
return len;
}
```
3. 应用程序开发
(1)连接网络
```c
uint8_t nb_connect_network(void)
{
nb_send_at_cmd("AT+CFUN=0", "OK", 2000);
nb_send_at_cmd("AT+CFUN=1", "OK", 2000);
nb_send_at_cmd("AT+COPS=1,2,\"46001\"", "OK", 2000);
nb_send_at_cmd("AT+CGDCONT=1,\"IP\",\"ctnet\"", "OK", 2000);
nb_send_at_cmd("AT+CFUN=0", "OK", 2000);
nb_send_at_cmd("AT+CFUN=1", "OK", 2000);
nb_send_at_cmd("AT+CSQ", "OK", 2000);
uint8_t i = 0;
while (i < 10)
{
if (NB_STATUS_READ() == 0)
{
return 1;
}
delay_ms(1000);
i++;
}
return 0;
}
```
(2)发送数据
```c
uint8_t nb_send(uint8_t *data, uint16_t len)
{
uint8_t retry = 3;
while (retry > 0)
{
nb_send_data(data, len);
if (nb_send_at_cmd("AT+NMGS?", "+NMGS:", 2000) == 1)
{
return 1;
}
retry--;
}
return 0;
}
```
(3)接收数据
```c
uint16_t nb_recv(uint8_t *data)
{
uint16_t len = 0;
if (nb_send_at_cmd("AT+NMGR?", "+NMGR:", 2000) == 1)
{
len = nb_recv_data(data);
}
return len;
}
```
以上代码仅供参考,实际使用时需要根据具体的硬件平台和NB-IoT模组进行相应的修改和调试。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)