[STM32L4] STM32L496提示 SIM 卡未插入

[复制链接]
28|11
WHALEE 发表于 2026-9-17 20:35 | 显示全部楼层 |阅读模式
我想要用 开发一款物联网应用,用 P‑L496‑CELL02 板载的 BG96 调制解调器。模组之间 AT 指令交互通信是正常的;可是我插上Micro‑SIM 卡仍然持续收到报错信息:Sim Not inserted。
我已经按照手册说明,在 CubeMX 中开启了PC2与PI3引脚;分别将它们设置为 0 和 1,并且在应用代码里面校验过这两个引脚的电平。
开发板通过 Arduino‑Vin 外接电源供电。。
我已经检查过焊接全都没问题。
下面是我的代码。所有 AT 命令返回都是 OK。
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_I2C1_Init();
MX_USB_DEVICE_Init();
MX_USART2_UART_Init();
MX_USART3_UART_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
/* USER CODE BEGIN 2 */
uint8_t response[256];
uint8_t byte;
uint16_t idx = 0;
#define SEND_AT(cmd) do { \
memset(response, 0, sizeof(response)); \
idx = 0; \
HAL_UART_Transmit(&huart1, (uint8_t*)cmd, strlen(cmd), 1000); \
while(idx < sizeof(response)-1) { \
if(HAL_UART_Receive(&huart1, &byte, 1, 500) == HAL_OK) \
response[idx++] = byte; \
else break; \
} \
HAL_UART_Transmit(&huart2, response, idx, 1000); \
HAL_Delay(1000); \
} while(0)
// Select microsim and power on modem
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_RESET);
HAL_Delay(2000);
HAL_GPIO_WritePin(GPIOI, GPIO_PIN_3, GPIO_PIN_SET);
HAL_Delay(2000);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_3, GPIO_PIN_SET);
HAL_Delay(5000);
HAL_UART_Receive(&huart1, (uint8_t *)response, sizeof(response) - 1, 1000);
memset(response, 0, sizeof(response));
// Wait for RDY from modem instead of fixed delay
//uint8_t rdyBuf[64];
//uint8_t rdyByte;
//uint16_t rdyIdx = 0;
uint8_t val;
//memset(rdyBuf, 0, sizeof(rdyBuf));
/*while(rdyIdx < sizeof(rdyBuf) - 1)
{
if(HAL_UART_Receive(&huart1, &rdyByte, 1, 10000) == HAL_OK)
{
rdyBuf[rdyIdx++] = rdyByte;
// Check if we received RDY
if(strstr((char*)rdyBuf, "RDY") != NULL)
{
HAL_UART_Transmit(&huart2, (uint8_t*)"Modem Ready!\r\n", 14, 1000);
break;
}
}
else
{
break;
}
}*/
// Now send AT commands
SEND_AT("AT+CMEE=2\r\n");
HAL_Delay(2000);
SEND_AT("AT+CFUN?\r\n");
HAL_Delay(2000);
SEND_AT("AT+CGMR\r\n");
HAL_Delay(2000);
SEND_AT("AT+QSIMSTAT?\r\n");
HAL_Delay(2000);
SEND_AT("AT+QSIMDET=0,0\r\n");
HAL_Delay(2000);
SEND_AT("AT&W\r\n");
HAL_Delay(2000);
//SEND_AT("AT+QCFG=?\r\n");
//HAL_Delay(8000);
SEND_AT("AT+CFUN=1,1\r\n");
HAL_Delay(10000);
HAL_UART_Receive(&huart1, (uint8_t *)response, sizeof(response) - 1, 1000);
memset(response, 0, sizeof(response));
val = (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_2) == GPIO_PIN_RESET) ? '0' : '1';
HAL_Delay(2000);
if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_2) == GPIO_PIN_RESET){
val = '0';
}
else{
val = '1';
}
HAL_UART_Transmit(&huart2, &val, 1, 1000);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_RESET);
HAL_Delay(2000);
val = (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_2) == GPIO_PIN_RESET) ? '0' : '1';
HAL_Delay(2000);
if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_2) == GPIO_PIN_RESET){
val = '0';
}
else{
val = '1';
}
HAL_UART_Transmit(&huart2, &val, 1, 1000);
val = (HAL_GPIO_ReadPin(GPIOI, GPIO_PIN_3) == GPIO_PIN_SET) ? '1' : '0';
HAL_Delay(2000);
if (HAL_GPIO_ReadPin(GPIOI, GPIO_PIN_3) == GPIO_PIN_SET){
val = '1';
}
else{
val = '0';
}
HAL_UART_Transmit(&huart2, &val, 1, 1000);
SEND_AT("AT+QSIMDET?\r\n");
HAL_Delay(2000);
SEND_AT("AT+QSIMSTAT?\r\n");
HAL_Delay(2000);
SEND_AT("AT+CPIN?\r\n");

公羊子丹 发表于 2026-9-18 09:44 | 显示全部楼层
所有 AT 都返回 OK 但一直 SIM Not inserted,说明模组本身活着、串口通,但 SIM 检测没通过。先分清是'物理没插好/接触不良'还是'检测逻辑不对'。用 AT+QSIMSTAT? 看它报告的插拔状态,再用 AT+CPIN? 看是提示'未插入'还是'需要 PIN',两者原因不同。
周半梅 发表于 2026-9-18 09:45 | 显示全部楼层
我赌问题在 SIM 检测引脚(PC2/PI3)配置与模组实际的上电顺序。你说开了 PC2 设 0、PI3 设 1,但 SIM 检测有'常开/常闭'两种接法,电平极性搞反了模组就认为没插卡。查 BG96 硬件手册里 SIM_DET 的有效电平,对照你开发板的实际电路,极性反了很常见。
帛灿灿 发表于 2026-9-18 09:46 | 显示全部楼层
补充个关键:BG96 对 SIM 检测有个上电时序要求——SIM_DET 状态要在模组上电初始化前就稳定,并且某些固件版本要求 SIM 卡先插好再给模组上电。你如果是先上电后插卡,或者检测电平在模组启动后才变,模组可能已经判定为'无卡'并不再刷新。试着重启模组(AT+CFUN=1,1 不够,要断电重启)并保证卡在位。
童雨竹 发表于 2026-9-18 09:47 | 显示全部楼层
想问下你 AT+QSIMDET=0,0 这两个参数设的是什么?这个命令是'配置 SIM 检测功能及其电平极性',两个参数分别是'使能检测'和'检测电平'。你设成 0,0 可能把检测关了或设错了极性。查 BG96 AT 手册,正确配置应该是 QSIMDET=1,<电平> 且电平与实际电路匹配。
万图 发表于 2026-9-18 09:47 | 显示全部楼层
从供电角度,SIM 卡瞬时电流较大(尤其注册时),如果 VDD_SIM 供电不稳或走线压降大,模组会认为卡不存在。你说用 Arduino-Vin 外接供电,确认 5V/3.3V 稳定,并且 VDD_SIM 输出(通常 1.8/3.0V)正常。用表测一下 SIM 座的 VCC 脚。
Wordsworth 发表于 2026-9-18 09:48 | 显示全部楼层
测试建议:把 SIM 卡拔下来,看 AT+QSIMSTAT? 和 AT+CPIN? 的返回值,再插上看值有没有变化。如果插拔报告值不变,说明检测引脚压根没生效,问题在检测硬件/配置;如果变了但 CPIN 仍报未插入,那就是 SIM 卡本身或 SIM 接口(时钟/数据)的问题。
Bblythe 发表于 2026-9-18 09:49 | 显示全部楼层
我之前在 BG96 上遇到过类似的,根因是 SIM 的时钟/复位脚接触不良。SIM 有 VCC、RST、CLK、I/O 四个信号,检测只查卡座,卡在但 CLK/I-O 不通照样报未插入。用示波器量一下模组工作时 SIM 的 CLK 有没有输出,没有就是模组侧没启动 SIM 接口。
Pulitzer 发表于 2026-9-18 09:50 | 显示全部楼层
补充:你提到'等 RDY 的代码被注释掉、改成固定延时'——这是个隐患。模组上电到能响应 SIM 命令需要时间,如果固定延时太短,模组还没初始化完 SIM 接口你就去查,自然报未插入。建议恢复'等待 RDY,再等 URC(比如 +CPIN: READY)'的逻辑,别用死延时。
Uriah 发表于 2026-9-18 09:50 | 显示全部楼层
问一下你这张 SIM 卡在手机上能正常用吗?先排除卡本身。如果是物联网卡,还要确认它没被绑定到别的 IMEI 或被停用(有些 NB/4G 卡有 IMEI 绑定)。BG96 用错了卡(比如只支持特定运营商频段)也可能表现异常。
Clyde011 发表于 2026-9-18 09:51 | 显示全部楼层
从根因排序:① SIM 检测极性/使能(QSIMDET 配置)② 上电时序与初始化等待 ③ VDD_SIM 供电与卡座接触 ④ SIM CLK/I-O 信号 ⑤ 卡本身。你所有 AT 都 OK 说明模组活着,建议先按 ①② 排查,再动硬件。
寂静之回响 发表于 2026-9-18 13:45 | 显示全部楼层
检查BG96模组供电电压是否稳定,VDD_SIM输出电压是否符合要求,同时用示波器检查SIM的CLK信号是否有输出。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

204

主题

205

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0