- UID
- 129443
- 性别
- 男
|
我使用GP32的SCI通讯时发现如下问题:
SCI发送的数据为:01 02 03 04 05 06 07 08 09 0A
单步运行时,串口调试助手接受的数据正常,数据为:
01 02 03 04 05 06 07 08 09 0A
全速运行时,串口调试助手接受的数据异常,数据为:
01 02 03 04 05 06 07 FF
这是什么原因????
我的程序如下:
#include /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
#include "datadefine.h" /* 全局变量及其子函数定义 */
#include "math.h" /* 数学处理函数 */
unsigned char aaa[10]@0x60 =
{1,2,3,4,5,6,7,8,9,10};
void SCIinit(void);
void SCIsendN(unsigned char ch[],unsigned char n);
void main(void)
{
DisableInterrupts; //关总中断;
SYSTEM_MCUinit(); //系统运行环境MCU硬件初始化
SYSTEM_RUANinit(); //系统运行环境软件初始化
////////////////////////////////////////
TXB = 1;
DELAYXms(1000);
SCIsendN((unsigned char *)aaa,10); //SCI串行发送N个字符到上位机
}
/***** SCI初始化 *********/
void SCIinit(void)
{
//==== SCI比特率寄存器(地址:0x0019) 复位:0x00(0b00000000) =====
SCBR = 0b00000010; //取:BD=4,PD=1; 内部总线频率Fbus = 2.4576Mhz,SCI串行通信时钟源FSCI=FBUS,定义比特率Bt = 9600Kbit/S
//位0 SCBR_SCR0 = 0; //SCI比特率选择位BD SCR2 SCR1 SCR0 = 000 :BD = 1(2^0) SCR2 SCR1 SCR0 = 001 :BD = 2(2^1) SCR2 SCR1 SCR0 = 010 :BD = 4(2^2)
//位1 SCBR_SCR1 = 1; // SCR2 SCR1 SCR0 = 011 :BD = 8(2^3) SCR2 SCR1 SCR0 = 100 :BD = 16(2^4) SCR2 SCR1 SCR0 = 101 :BD = 32(2^5)
//位2 SCBR_SCR2 = 0; // SCR2 SCR1 SCR0 = 110 :BD = 64(2^6) SCR2 SCR1 SCR0 = 111 :BD = 128(2^7)
//位3 未定义 = 0;
//位4 SCBR_SCP0 = 0; //SCI比特率预分频位PD SCP1 SCP0 = 00 D = 1 SCP1 SCP0 = 01 D = 3
//位5 SCBR_SCP1 = 0; // SCP1 SCP0 = 10 D = 4 SCP1 SCP0 = 11 D = 13
//位6 未定义 = 0; //SCI采用内部总线时钟(FSCI=FBUS) 则比特率Bt = FBUS/(64*PD*BD)
//位7 未定义 = 0; // = 2457600/(64*1*4)
// = 9600(Bit/S)
//==== SCI控制寄存器1(地址:0x0013) 复位:0x00(0b00000000) =======
SCC1 = 0b01000000; //正常模式,允许SCI,正常码输出,8位数据,地址唤醒,起始位计数,无校验
//位0 SCC1_PTY = 0; //奇偶校验类型选择位: =0: 偶校验; =1: 奇校验; 不进行奇偶校验时, 该位写0;
//位1 SCC1_PEN = 0; //奇偶校验允许位 =0: 不进行奇偶校验; =1: 允许进行奇偶校验;
//位2 SCC1_ILTY = 0; //空闲线类型位(决定SCI何时开始计数空闲字符的位数); =0: 空闲字符位从"起始位"开始计数; =1: 空闲字符位从"停止位"开始计数;
//位3 SCC1_WAKE = 0; //唤醒条件位 =0: 空闲线唤醒 =1: 地址唤醒
//位4 SCC1_M = 0; //模式-字符长度选择位(定义收发数据格式); =0: 8位字符; =1: 9位字符;
//位5 SCC1_TXINV = 0; //发送输出反转标志位 =0: 正常码输出 =1: 反码输出
//位6 SCC1_ENSCI = 1; //SCI允许位 =0: 禁止SCI,PTE0/TxD,PTE1/RxD两引脚作为I/O使用; =1: 允许SCI,PTE0/TxD,PTE1/RxD两引脚作为SCI使用;
//位7 SCC1_LOOPS = 0; //循环模式选择位 =0: 正常模式; =1: 循环模式(接收引脚RxD与SCI内部断开,内部发送数据直接作为接收的输入,用于自测试);
//==== SCI控制寄存器2(地址:0x0014) 复位:0x00(0b00000000) =========
SCC2 = 0b00001100; //允许接受中断,不允许发送中断,允许发送器发送,允许接收器接收,等待状态唤醒,不发送终止符
//位0 SCC2_SBK = 0; //发送终止位 =0: 发送非终止字符 =1: 发送终止字符
//位1 SCC2_RWU = 0; //接收器唤醒位 =0: 正常操作 =1: 等待状态
//位2 SCC2_RE = 1; //接收器允许位 =0: 不允许接收器接收 =1: 允许接收器接收
//位3 SCC2_TE = 1; //发送器允许位 =0: 不允许发送器发送 =1: 允许发送器发送
//位4 SCC2_ILIE = 0; //空闲线中断允许位 =0: 不允许空闲线中断请求 =1: 允许空闲线中断请求
//位5 SCC2_SCRIE = 1; //接受中断允许位 =0: 不允许接受中断请求 =1: 允许接受中断请求
//位6 SCC2_TCIE = 0; //发送完成中断允许位 =0: 不允许发送完成中断 =1: 允许发送完成中断
//位7 SCC2_SCTIE = 0; //发送中断允许位 =0: 不允许产生发送中断请求 =1: 允许产生发送中断请求
//==== SCI控制寄存器3(地址:0x0015) 复位:0x00(0b00000000) =====
SCC3 = 0b00000000; //SCI控制寄存器3
//位0 SCC3_PEIE = 0; //接收器奇偶错误中断允许位 =1: 允许接收器奇偶错误中断; =0: 屏蔽接收器奇偶错误中断;
//位1 SCC3_FEIE = 0; //接收器帧错误中断允许位 =1: 允许接收器帧错误中断; =0: 屏蔽接收器帧错误中断;
//位2 SCC3_NEIE = 0; //接收器噪声错误中断允许位 =1: 允许接收器噪声错误中断; =0: 屏蔽接收器噪声错误中断;
//位3 SCC3_ORIE = 0; //接收器溢出错误中断允许位 =1: 允许接收器溢出错误中断; =0: 屏蔽接收器溢出错误中断;
//位4 SCC3_DMATE = 0; //DMA发送允许位 (GP32MCU无此功能,写入0);
//位5 SCC3_DMARE = 0; //DMA接收允许位 (GP32MCU无此功能,写入0);
//位6 SCC3_T8 = 0; //发送位8;
//位7 SCC3_R8 = 0; //接收位8(只读);
//==== SCI状态寄存器1(只读)(地址:0x0016) 复位:0xC0(0b11000000) ========
//SCS1 = 0b00000000;
//位0 SCS1_PE = 0; //接收器奇偶错误标志位 =1: 接收器出现奇偶错误; =0: 接收器未出现奇偶错误;
//位1 SCS1_FE: = 0; //接收器帧错误标志位 =1: 接收器出现帧错误; =0: 接收器未出现帧错误;
//位2 SCS1_NF: = 0; //接收器噪声错误标志位 =1: 接收器出现噪声错误; =0: 接收器未出现噪声错误;
//位3 SCS1_OR: = 0; //接收器溢出错误标志位 =1: 接收器出现溢出错误; =0: 接收器未出现溢出错误;
//位4 SCS1_IDLE = 0; //接收器空闲标志位 =1: 接收器处于空闲状态; =0: 接收器处于忙状态;
//位5 SCS1_SCRF = 0; //接收器满标志位 =1: 接收器已满,可以从数据寄存器SCDR中取出数据; =0: 接收器未满,不能从数据寄存器SCDR中取出数据;
//位6 SCS1_TC = 0; //发送完成标志位 =1: 发送已经完成; =0: 发送尚未完成;
//位7 SCS1_SCTE = 0; //发送缓冲区空标志位 =1: 发送缓冲区空,数据已经移入发送移位寄存器; =0: 发送缓冲区满,数据尚未移入发送移位寄存器;
//==== SCI状态寄存器2(只读)(地址:0x0017) 复位:0xC0(0b11000000) ========
//SCS2 = 0b00000000;
//位0 SCS2_BKF = 0: //接收进行标志位 =1: 接收器正在接收; =0: 接收器接收完毕;
//位1 SCS2_RPF = 0: //终止码标志位 =1: 检测到终止码; =0: 未检测到终止码;
//位2 未定义
//位3 未定义
//位4 未定义
//位5 未定义
//位6 未定义
//位7 未定义
//==== SCI数据寄存器(地址:0x0018) 复位:0xC0(0b00000000) ========
//SCDR = 0b00000000; //SCI数据寄存器,发送前写入,接受后取出
}
/*** SCI串行发送N个字符 *******/
void SCIsendN(unsigned char ch[],unsigned char n)
{
unsigned char i,tmp=0;
for(i=0; i
{
//判断待发送的数据是否已经移入到移位寄存器(发送缓冲区是否为空)? 是,则可以发送
while(SCS1_SCTE == 0); //循环,直到 SCS1_SCTE =1 (发送缓冲区空)
tmp = SCS1; //读出 SCI状态寄存器1;
SCDR = ch; //将待发送的数据送到 SCI数据寄存器
}
}
|
|