赛元部分芯片具有 SSI(USCI)功能,称为三合一接口,是芯片内部集成了三个三选一 通用串行接口电路,可方便 MCU 与不同接口的器件或者设备的连接。用户可通过配置寄存 器 OTCON 的 USMD1[1:0]、USMD0[1:0],或 TMCON 的 USMD2[1:0]位将 USCI 接口配置 为 SPI、TWI 和 UART 中任意一种通信模式。本文档主要包含使用 SSI(USCI)过程中出 现的注意事项以及常见问题,有以下内容:
1、SSI/USCI 中的 UART 通讯使用注意事项;
2、SPI 通讯注意事项;
3、TWI(IIC)通讯注意事项;
4、使用硬件 TWI(IIC)出现通信数据错误的情况是什么原因;
具体内容如下:
1、SSI/USCI 中的 UART 通讯使用注意事项
1) USCI 的 UART 发送中断标志 TI 和接收中断标志 RI 在同一个寄存器上,此寄存器 不能位操作,所以在清除 TI 和 RI 时会对整个寄存器进行与操作,这样当 UART 进 行全双工通信时发送和接收中断有可能同时产生,或者是两者之间间隔时间很短, 会出现 TI 或者 RI 被误清除导致中断丢失的风险,因此在全双工通信应用场景中, 通信需要有容错机制,不能因为某次中断丢失就导致通讯崩溃,在发送数据后不能 通过死等发送标志来判断发送是否完成,需要加入超时监测保证在一段时间后可以 退出等待;
2) 对于通信,要特别注意通信双方的配合,通信逻辑要特别注意,做好通信的错误冗 余,不能因为某一次或者是某几次通信错误就导致通信出现终止现象,建议在通信 超过一定时间没有接收到正确的数据后重新启动通信,重新启动通信包括通信相关 的寄存器清零再重新配置,以及通信使用到的一些变量,包含数据缓存数组,以及 计数的相关变量都要进行清零,以保证通信逻辑出错后重新启动通信,可以使通信 从最原始状态开始运行。
2、SPI 通讯注意事项
1) 由于 SPI 协议只看边沿信号,所以如果通信线有干扰导致通信错位后比较容易导致 通信数据一直出错,一般建议当检测到通信数据出错后重置一下 SPI,以避免因为 噪声等原因误接收 CLK 后导致通讯数据一直错下去;
2) 为了避免 SPI 功能打开时误产生 CLK(此时管脚从 IO 切换到 SPI 功能),必须在打 开 SPI 前根据 CLK 的空闲电平设置,先将 IO 口设置为对应的电平状态。如设置 CPOL = 0 空闲为低电平时需要将 CLK 对应的 IO 设置输出 0 再打开 SPI(SPEN = 1),反之亦然,否则会导致通讯错位;
3) 95F 系列 MCU 的 SPI 具备 8 位和 16 位传输模式,SPI 设置为 16 位模式时,必须 先写入高字节 SPDH[7:0],后写入低字节 SPDL[7:0],低字节写入后立刻开始传送, 注意:SPDH[7:0]仅用于 16 位模式;
4) 95F 系列 SPI 最高速率可达到 16MHz,但是当通信口线上的负载增加时,端口输出 的波形会产生畸变,引起通信时序异常,所以当 SPI 通信速率超过 10MHz 时,用 户需要考虑口线上的负载大小以保证正常的通信,一般加上拉电阻可以改善波形畸 变的情况。
3、TWI(IIC)通讯注意事项
1) 92F 系列 MCU 的 TWI 只支持从机模式,不支持主机模式,IIC 主机模式需要使用 软件模拟,92F 系列从机模式下最高支持 200K/bit 的通信速率;
2) 95F 系列 MCU 的 TWI 支持主从机模式,最高通信速率可达 400KHz,做主机时由 于没有中断标志判断 STOP,用户在使用时需在发送 STOP 信号前后加短暂延时防 止通信出错,延时时间与通信速率类似;
3) 95F 系列 TWI 主机模式下,为防止 TWI 通信时 1byte 数据还没有发送完就发送 Start 信号导致通信异常,需要在先执行 AA=0,延时一段时间后关闭 TWI 功能,再开启 TWI 后再启动 Start 信号,如下: US0CON0&=0xF7; //先将 AA 置 0 Delay (); //延时一段时间,延时时间长度要大于 1byte 数据的传输时间 US0CON0 &=0x7f; //关闭 TWI US0CON0 |= 0x80; //打开 TWI
4) 使用 TWI 功能时,建议用户在中断服务函数中通过状态标志位 STATE[2:0]查询通 信状态,再配合通信数据逻辑进行数据处理和发送;
4、使用硬件 TWI(IIC)出现通信数据错误的情况是什么原因
使用 92F 系列芯片时,通讯速率较快时(超过 100K),可能会出现通信数据出错的情况, 错误表现可能有以下 2 种情况:
1) 发送的数据是上 1byte 的数据;
2) 发送的数据会错位,表现为本次发送的数据既有当前 byte 的前几位,又有前一个 byte 的后几位数;
出现以上两种情况的原因为:92F 系列芯片的 CPU 处理速度跟不上通信的速度,IIC 通信 协议的 CLK 线是由主机控制的,通常情况下当通信速度较快时,数据间的发送间隔也比 较短,当从机发送完 1byte 数据之后,一般的写法是在 IIC 中断中准备下一个 1byte 数据 的发送,当通信速度很快时,从机还没来得及把需要发送的数据赋值给发送数据缓存寄存 器,主机就发送了下一个 byte 的 CLK 信号过来,从机会把上一个 byte 的数据发送出去, 当给数据缓存寄存器赋值后又会发送当前数据,所以会出现数据错误的情况。
针对以上情况,解决方案为:
1) 减小 IIC 通信速率;
2) 较小 IIC 中断处理,加快数据缓存寄存器的赋值,尽快准备好数据;
3) 增加 byte 与 byte 之间的时间间隔,给从机留够足够的时间进行中断处理和数据赋值。
|