//[IIC.c]IIC总线通信-------------------------------------------------------* //外部函数: * // (1)IICinit:IIC模块初始化 * // (2)IICread1:MCU从从机读1个字节 * // (3)IICwrite1:MCU向从机写1个字节 * // (4)IICreadN:MCU从从机读N个字节 * // (5)IICwriteN:MCU向从机写N个字节 * //内部函数: * // (1) SendSignal:在IIC总线上发送起停信号 * // (2) Wait:等待应答或一个字节数据的传送完成 * //硬件连接: * // MCU的IIC接口与从机的IIC接口相连,GB60的IIC模块的引脚SDA和SCL分别与PTC2* // 和PTC3引脚复用,这两个引脚应分别与从机的IIC模块的SDA和SCL相连 * //说明:本文件与具体的芯片型号有关 * //-------------------------------------------------------------------------* //[SCI.c]串行通信----------------------------------------------------------* //本文件包含外部函数: * // (1)SCIinit:串行口初始化 * // (2)SCIsend1:串行发送1个字节 * // (3)SCIsendN:串行发送n字节 * // (4)SCIre1:串行接收1字节 * // (5)SCIreN:串行接收n字节 * //硬件连接: * // 本工程使用GB60的SCI模块1,它的发送引脚TxD1和接收引脚RxD1分别与PTE0和 * // PTE1复用.该模块接口与PC方的COM相连. * //说明:本文件与具体的芯片型号有关 * //-------------------------------------------------------------------------* //头文件 #include //dp512 MCU映像寄存器名定义 #include "SCI.h" //该头文件包含SCI相关寄存器及标志位宏定义 extern INT8U ReBuf[]; //接收缓冲区 extern INT8U Flag; //正确接收一帧的标志位 //SCIinit:串行口初始化-----------------------------------------------------* //功 能:对串行口进行初始化,设置波特率为9600Hz(fBUS = 24MHz),无校验, * // 正常模式(8位数据),允许发送器,允许接收器,查询方式收发. * //参 数:无 * //返 回:无 * //说 明:和设置波特率相关的寄存器有SCI1BDH(高8位)和SCI1BDL(低8位),应先设置* * // SCI1BDH, 再设置SCI1BDL,其中SCI1BDH的高3位未定义,其余的13位合为BR,* // 定义了波特率的分频因子.BR = 0,禁止波特率发生器;BR = 1-8191, * // SCI波特率 = 总线频率 / (16 * BR). * //-------------------------------------------------------------------------* void SCIinit(void) { SCI0BD=0x009C; SCI0CR2=0x0c;//接收中断禁止 asm LDAA SCI0SR1 } //SCIsend1:串行发送1个字节-------------------------------------------------* //功 能:串行发送1个字节 * //参 数:要发送的数据 * //返 回:无 * //-------------------------------------------------------------------------* void SCIsend1(INT8U o) { while(!(ReSendStatusR & (1 << SendTestBit)));//判断发送缓冲区是否为空 ReSendDataR = o; } //SCIsendN:串行发送N个字节-------------------------------------------------* //功 能:发送数组中的N个字节数据 * //参 数: * // (1) n:待发送数据的字节数 * // (2) ch:存放这些数据的数组首地址 * //返 回:无 * //内部调用:SCIsend1 * //-------------------------------------------------------------------------* void SCIsendN(INT8U n,INT8U ch[]) { INT8U i; for (i = 0;i < n;i++) SCIsend1(ch[i]); } //SCIre1:串行收一个字节数据------------------------------------------------* //功 能:从串行口接收1个字节的数据 * //参 数:标志指针p * //返 回:接收到的数据(若接收失败,返回0xff) * //说 明:参数*p带回接收标志.*p = 0,收到数据;*p = 1,未收到数据. * //-------------------------------------------------------------------------* INT8U SCIre1(INT8U *p) { INT16U k; INT8U i; for (k = 0;k < 0xfbbb;k++)//有时间限制 if ((ReSendStatusR & (1 << ReTestBit)) != 0)//判断接收缓冲区是否满 { i = ReSendDataR; *p = 0x00; break; } if (k >= 0xfbbb) //接受失败 { i = 0xff; *p = 0x01; } return i; } //SCIreN:串行接收N个字节---------------------------------------------------* //功 能:接收N个字节数据,并存放在ch数组中 * //参 数: * // (1) n:待接收的数据字节数 * // (2) ch:存放数据的数组首地址 * //返 回:接收标志为0,收到数据;为1,未收到数据 * //内部调用:SCIre1 * //-------------------------------------------------------------------------* INT8U SCIreN(INT8U n,INT8U ch[]) { INT8U m; INT8U fp; //接收标志 m = 0; while (m < n) { ch[m] = SCIre1(&fp); if (fp == 1) return 1; //接收失败 m++; } return 0; //接收成功 } interrupt void isrSCI1Re(void) { DisableMCUint(); //关总中断 SCIreN(17,ReBuf); //接收一帧数据 if (ReBuf[0] == '#') //判断是否是完整的一帧 Flag = 1; //为1:标志接收到完整的一帧数据 else Flag = 0; //为0:标志接收有误 EnableMCUint(); //开总中断 }