GSM短信收发介绍

1、短消息收发的实现模式

  Gsm收发短消息又分三种模式:BLOCK 模式、TEXT 模式和PDU 模式。BLOCK 模式现在用的很少了;TEXT 模式则只能发送ASCII 码,它不能发送中文的UNICODE码(确切地讲,从技术上来说是可以用于发送中文短消息的,但是国内的手机基本上不支持);而PDU 模式开发起来则较为复杂,它需要编写专门的函数来将文本转换为PDU 格式,但PDU 模式被所有手机支持,可以使用任何字符集,它也是手机默认的编码方式。

2、PDU 模式详细介绍

  用PDU 模式收发短消息可以使用三种编码: 7-bit 编码、8-bit 编码和UCS2 编码。7-bit编码用于发送普通的ASCII字符;8-bit 编码通常用于发送数据消息,如图片或铃声等;UCS2编码用于发送Unicode 字符。由于我们在系统中要实现中文短消息的发送,所以选择用UCS2编码,即中文Unicode 码。

 2.1 UCS2 编码原理

  所谓UCS2 编码,是将单个的字符(1-2 个字节)按ISO/IEC10646 的规定,转变为16 位的Unicode 宽字符。即将单个的字符转换为由四位的‘0’-‘9’、‘A’-‘F’的数字和字母组成的字符串。待发送的消息以UCS2 码的形式进行发送。

 2.2 发送PDU 串的结构分析

  通过UCS2 编码我们得到中文Unicode 码,接着就可以进行发送PDU 串的编制了。从表面上看,PDU 串是ASCII 码串,同样由‘0’-‘9’、‘A’-‘F’这些数字和字母组成。它们是8 位字节的十六进制数,或者BCD 码十进制数。PDU 串除了包含所发送的消息本身外,还包含很多其它参数信息,如服务中心号码、目标号码和编码方式等。现用一个实例说明发送PDU 串的结构和编排方式。
  例:08 91 683108100005F0 31 00 0D 91 683119109991F2 00 08 C2 06 60A8597DFF01
  分段含义解释说明
  08 SMSC 地址信息的长度共8 个八位字节(包括91)
  91 SMSC 地址格式(TON/NPI) 用国际格式号码(在前面加‘+’)
  68 31 08 10 00 05 F0 SMSC 地址8613800100500,补‘F’凑成偶数个
  31 基本参数(TP-MTI/VFP) 要求发送回复
  00 消息基准值(TP-MR) 0
  0D 目标地址数字个数共13 个十进制数
  91 目标地址格式(TON/NPI)
  A1:国内格式
  91:国际格式
  81:未知,+86 可带可不带。
  683119109991F2 目标地址(TP-DA) 8613910199192,补‘F’凑成偶数个
  00 协议标识(TP-PID) 是普通GSM 类型,点到点方式
  08 用户信息编码方式
  (TP-DCS)
  00:表示7-bit 编码, 08:表示UCS2 编码,
  04:表示8-bit 编码。
  C2 有效期(TP-VP) 5 分钟
  06 用户信息长度(TP-UDL) 实际长度6 个字节
  60 A8 59 7D FF 01 用户信息(TP-UD) “您好!”
  这里需要注意的几点:
  ①比较SMSC 地址分段:68 31 08 10 00 05 F0 与真实SMSC 地址8613800100500F(为
了凑足14 位,在末尾补F),不难发现只需将前者奇偶位对调即可得到后者。同样,目标地址分段683119109991F2 与实际目标地址13910199192F 之间的关系也是如此。
  ②若“SMSC 地址信息的长度”分段的值为00,则意味着SMSC 地址字符串的长度为零,PDU 串的“SMSC 地址格式”段和“SMSC 地址”段将省去。且将使用SIM 卡设置的SMSC 地址。
上例中的PDU 串变为:00 31 00 0D 91 683119109991F2 00 08 C2 06 60A8597DFF01
  ③.对于用户信息长度,可通过VB 中的Len 函数求得,如“您好!”,用Len(“您好!”)
得到是3,那么3*2=6 即为用户信息长度06(这里要转换为16 进制,并且是两位)。
④用户信息(TP-UD)段最大容量是140 字节,所以在UCS2 编码方式下,可发送短消息的最大字符数是70 个。

 2.3 接收pdu串的结构分析

  接收PDU 串和发送PDU 串结构是不完全相同的。通过一个实例来分析,假定收到的短消息其PDU 串为:08 91 68 31 08 10 00 05 F0 04 0D 91 68 31 19 10 99 91 F2 00 08 40 40 60 31 35 30 23 06 60 A8 59 7D FF 01
  参照规范,具体分析:
  分段含义解释说明
  08 SMSC 地址信息的长度共8 个八位字节(包括91)
  91 SMSC 地址格式(TON/NPI) 用国际格式号码(在前面加‘+’)
  68 31 08 10 00 05 F0 SMSC 地址8613800100500,补‘F’凑成偶数个
  84 基本参数(TP-MTI/MMS/RP) 接收,无更多消息,有回复地址
  0D 回复地址数字个数共13 个十进制数(不包括91 和‘F’)
  91 回复地址格式(TON/NPI) 国际格式
  68 31 19 10 99 91 F2 回复地址(TP-RA) 8613910199192,补‘F’凑成偶数个
  00 协议标识(TP-PID) 是普通GSM 类型,点到点方式
  08 用户信息编码方式(TP-DCS) UCS2 编码
  40 90 10 31 35 30 23 服务时间戳(TP-SCTS) 2004-09-01 13:53:03
  06 用户信息长度(TP-UDL) 实际长度6 个字节
  60 A8 59 7D FF 01 用户信息(TP-UD) “您好!”
  通过分析,我们可以获取其中的有用信息。如:短信服务中心号码是+8613800100500,发送方号码是13910199192,发来的消息内容是“您好!”,以及发送时间是:2004-09-01 13:53:03。

<think>我们正在处理关于LAN9215发送FIFO状态寄存器返回失败的问题。根据用户提供的信息,我们需要分析可能的原因。虽然没有直接关于LAN9215的引用,但我们可以参考类似芯片(如LAN9252、LAN9253)的文档和一般网络控制器的工作原理。首先,我们需要明确问题:读取发送FIFO状态寄存器时返回失败。可能的原因包括: 1.寄存器地址错误:检查是否访问了正确的寄存器地址。 2.通信接口问题:SPI/I2C等通信接口可能存在问题,导致读取失败。3.硬件连接问题:如线路连接不良、电源不稳定等。 4.芯片状态异常:芯片可能处于复位状态、低功耗模式或故障状态。5.软件配置错误:例如,没有正确初始化芯片,或者访问时序不符合要求。参考引用[2]中提到了通过ecx_FPRD函数读取寄存器,这属于EtherCAT从站控制器的读取方式。虽然LAN9215不是EtherCAT从站控制器,但寄存器读取的原理类似。如果读取函数返回错误,可能是通信超时或从站无响应。参考引用[3]中关于LAN9253的低功耗模式描述,芯片在低功耗模式下可能无法正常响应寄存器访问。因此,如果LAN9215处于类似低功耗模式,也可能导致读取失败。 建议的排查步骤: 1.确认寄存器地址:查阅LAN9215数据手册,确认发送FIFO状态寄存器的地址。2.检查硬件连接:确保电源、时钟、复位信号和通信接口(如SPI)的电气连接和信号质量正常。3.检查芯片状态:确认芯片是否已正确初始化并退出复位状态。如果芯片支持低功耗模式,检查是否意外进入了低功耗模式。 4.通信时序:确保读取寄存器的时序符合数据手册要求,包括时钟频率、数据建立和保持时间等。5.错误处理:检查读取函数返回的错误码,根据错误码进一步分析。 由于没有LAN9215的具体引用,我们只能给出一般性建议。如果问题仍然存在,建议详细阅读LAN9215的数据手册,特别是关于发送FIFO状态寄存器和通信接口的章节。相关问题:1.LAN9215的发送FIFO状态寄存器的地址是多少?2.如何正确初始化LAN9215以确保寄存器可访问?3.LAN9215在低功耗模式下能否访问寄存器?</think>### LAN9215发送FIFO状态寄存器失败原因分析 发送FIFO状态寄存器读取失败可能由以下原因导致,需逐步排查: 1. **硬件连接问题** - 检查SPI/I²C总线物理连接是否正常(时钟、数据线是否短路/断路) - 验证电源稳定性:推荐使用示波器检测$V_{DD}$电压波动(应在3.3V±5%范围内) - 确认复位信号状态:确保`nRST`引脚在操作期间保持高电平 - *典型症状:连续多次读取返回不一致数据* 2. **寄存器访问时序违规** - 检查芯片手册要求的时序参数: $$ t_{SU} \geq 10\text{ns} \quad (\text{建立时间}) $$ $$ t_{HD} \geq 5\text{ns} \quad (\text{保持时间}) $$ - 过高的时钟频率可能导致时序违例(LAN9215最大SPI时钟为25MHz) - *解决方案:降低时钟频率至15MHz测试* 3. **芯片状态异常** - **低功耗模式影响**:类似LAN9253[^3],若进入休眠模式(如通过`PMCR`寄存器控制),需先发送唤醒命令 - **FIFO溢出状态**:当发送FIFO溢出时,状态寄存器可能锁存错误标志位 - **时钟同步丢失**:检查RMII接口的`REF_CLK`是否稳定(要求50MHz±50ppm) 4. **软件配置错误** ```c // 典型配置流程示例 write_reg(LAN9215, TX_CFG, 0x01); // 启用发送引擎 write_reg(LAN9215, FIFO_INT, 0x80); // 使能FIFO中断 uint32_t status = read_reg(LAN9215, TX_FIFO_STATUS); // 读取失败位置 ``` - 常见错误: - 未启用发送引擎(`TX_CFG`寄存器bit0) - 地址偏移计算错误(寄存器地址需按16位对齐) - 未处理先前的传输错误(需清除`TX_STATUS`寄存器的错误位) 5. **芯片故障指示** 检查关键状态寄存器: - `INT_STS`:中断状态寄存器(bit6指示FIFO错误) - `HW_CFG`:硬件配置寄存器(bit29为硬件故障标志) - `BYTE_TEST`:返回固定值`0x87654321`验证总线连通性 --- ### 推荐排查步骤 1. **基础验证** ```bash # 通过EEPROM验证通信链路 dd if=/sys/bus/spi/devices/spi0.0/eeprom bs=16 count=1 ``` 若EEPROM读取失败→检查物理层 2. **状态机复位** ```c write_reg(LAN9215, HW_CFG, 0x00000004); // 软复位 delay(50); // 等待50ms复位完成 write_reg(LAN9215, TX_CFG, 0x00000001); // 重新使能发送 ``` 3. **FIFO深度测试** ```c // 逐步填充FIFO测试 for(int i=0; i<64; i++) { write_reg(LAN9215, TX_DATA, test_pattern[i]); uint32_t level = read_reg(LAN9215, TX_FIFO_INF) & 0xFF; printf("FIFO Level: %d\n", level); } ``` 观察填充过程中状态寄存器变化 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值