⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lowlevel.c

📁 freescale crc模块驱动 经调试
💻 C
📖 第 1 页 / 共 3 页
字号:
}

/******************************************************************************
 * 函数原型: int UART0GetRx(void *buf, int len);                              *
 * 功能: 将UART0接收缓冲区的前len个字节放到buf中                              *
 * 说明: 返回值为放置到buf中的字节数                                          *
 ******************************************************************************/
int UART0GetRx (void *buf, int len)
{
	int i;
	// DisableInterrupts;
	for(i = 0; i < len; i++)
	{
		if(cUART0RxHead == cUART0RxEnd)
			break;
		((char *)buf)[i] = cUART0RxBuf[cUART0RxHead];
		cUART0RxHead ++;
		if(cUART0RxHead >= CMUART0RxBufLenMax)
			cUART0RxHead = 0;
	}
	// EnableInterrupts;
	return i;
}

/******************************************************************************
 * 函数原型: void UART0Echo(void);                                            *
 * 功能: 将接收到的数据通过UART0口发回                                        *
 * 说明: 1次最多接收60个字节                                                  *
 ******************************************************************************/
void UART0Echo (void)
{
	int n;
	char buf[64];
	n = UART0GetRx(buf,60);
	if(n == 0)
		return;
	UART0Send(buf,n);
}

/******************************************************************************
 * 函数原型: void UART1Send(void *buf, int len);                              *
 * 功能: 将buf中的头len个字节放到UART1的发送缓冲区中                          *
 * 说明: buf为要发送的数组,len为要发送的字节数                                *
 ******************************************************************************/
void UART1Send (void *buf, int len)
{
	int i;
	if(len < 1)
		return;
	// DisableInterrupts;
	for(i = 0; i < len; i++)
	{
		cUART1TxBuf[cUART1TxEnd] = ((char *)buf)[i];
		cUART1TxEnd ++;
		if(cUART1TxEnd >= CMUART1TxBufLenMax)
			cUART1TxEnd = 0;
		if(cUART1TxEnd == cUART1TxHead)
			cUART1TxHead ++;
		if(cUART1TxHead >= CMUART1TxBufLenMax)
			cUART1TxHead = 0;
	}
	SCI1CR2_SCTIE = 1;                                     // 使能发送数据寄存器空中断
	// EnableInterrupts;
}

/******************************************************************************
 * 函数原型: int UART1GetRx(void *buf, int len);                              *
 * 功能: 将UART1接收缓冲区的前len个字节放到buf中                              *
 * 说明: 返回值为放置到buf中的字节数                                          *
 ******************************************************************************/
int UART1GetRx (void *buf, int len)
{
	int i;
	// DisableInterrupts;
	for(i = 0; i < len; i++)
	{
		if(cUART1RxHead == cUART1RxEnd)
			break;
		((char *)buf)[i] = cUART1RxBuf[cUART1RxHead];
		cUART1RxHead ++;
		if(cUART1RxHead >= CMUART1RxBufLenMax)
			cUART1RxHead = 0;
	}
	// EnableInterrupts;
	return i;
}

/******************************************************************************
 * 函数原型: void UART1Echo(void);                                            *
 * 功能: 将接收到的数据通过UART1口发回                                        *
 * 说明: 1次最多接收60个字节                                                  *
 ******************************************************************************/
void UART1Echo (void)
{
	int n;
	char buf[64];
	n = UART1GetRx(buf,60);
	if(n == 0)
		return;
	UART1Send(buf,n);
}

/******************************************************************************
 * 函数原型: void UART2Send(void *buf, int len);                              *
 * 功能: 将buf中的头len个字节放到UART2的发送缓冲区中                          *
 * 说明: buf为要发送的数组,len为要发送的字节数                                *
 ******************************************************************************/
void UART2Send (void *buf, int len)
{
	int i;
	if(len < 1)
		return;
	for(i = 0; i < len; i++)
	{
		cUART2TxBuf[cUART2TxEnd] = ((char *)buf)[i];
		cUART2TxEnd ++;
		if(cUART2TxEnd >= CMUART2TxBufLenMax)
			cUART2TxEnd = 0;
		if(cUART2TxEnd == cUART2TxHead)
			cUART2TxHead ++;
		if(cUART2TxHead >= CMUART2TxBufLenMax)
			cUART2TxHead = 0;
	}
}

/******************************************************************************
 * 函数原型: int UART2GetRx(void *buf, int len);                              *
 * 功能: 将UART2接收缓冲区的前len个字节放到buf中                              *
 * 说明: 返回值为放置到buf中的字节数                                          *
 ******************************************************************************/
int UART2GetRx (void *buf, int len)
{
	int i;
	for(i = 0; i < len; i++)
	{
		if(cUART2RxHead == cUART2RxEnd)
			break;
		((char *)buf)[i] = cUART2RxBuf[cUART2RxHead];
		cUART2RxHead ++;
		if(cUART2RxHead >= CMUART2RxBufLenMax)
			cUART2RxHead = 0;
	}
	return i;
}

/******************************************************************************
 * 函数原型: void UART2Echo(void);                                            *
 * 功能: 将接收到的数据通过UART2口发回                                        *
 * 说明: 1次最多接收15个字节                                                  *
 ******************************************************************************/
void UART2Echo (void)
{
	int n;
	char buf[16];
	n = UART2GetRx(buf,15);
	if(n == 0)
		return;
	UART2Send(buf,n);
}

/******************************************************************************
 * 函数原型: void InitEEPROM(void);                                           *
 * 功能: EEPROM相关寄存器的初始化                                             *
 * 说明: 无                                                                   *
 ******************************************************************************/
void InitEEPROM (void)
{
	// 0 1 001100
	ECLKDIV = 0x4C;                                        // 1.osc时钟经过8分频进入EEPROM分频器
	                                                       // 2.EEPROM的输入时钟约为189Hz
	INITEE = (EEPROMAddrStart >> 8) | 0x01;                // 注意这里的设定方法(S12CoreUserGuide)
	MISC |= 0x01;                                          // 使能EEPROM
	ECNFG = 0x00;                                          // EEPROM配置寄存器
}

/******************************************************************************
 * 函数原型: char EEPROMReadyCheck(void);                                     *
 * 功能: 检查对EEPROM的操作是否准备就绪                                       *
 * 说明: 准备就绪,返回0;未准备就绪,返回-1                                     *
 ******************************************************************************/
char EEPROMReadyCheck (void)
{
	if(!ECLKDIV_EDIVLD)                                    // ECLKDIV寄存器已经被设置
		return -1;
	if(ESTAT_ACCERR)                                       // 非法进入选定的EEPROM序列
		return -1;
	if(ESTAT_PVIOL)                                        // 试图编程或擦除1个受保护的EEPROM存储区
		                                                   // 域地址
		return -1;
	return 0;
}

/******************************************************************************
 * 函数原型: void EEPROMWaitForCmdEmpty(void);                                *
 * 功能: 等待"可以进行下一次操作"的状态                                       *
 * 说明: 无                                                                   *
 ******************************************************************************/
void EEPROMWaitForCmdEmpty (void)
{
	while(!ESTAT_CBEIF);                                   // 等待进入"接收新命令"的状态
}

/******************************************************************************
 * 函数原型: void EEPROMWaitForCmdComplete(void);                             *
 * 功能: 等待所有命令执行完毕                                                 *
 * 说明: 无                                                                   *
 ******************************************************************************/
void EEPROMWaitForCmdComplete (void)
{
	ESTAT_CBEIF = 1;                                       // "等待接收新命令"标志清0
	while(!ESTAT_CCIF);                                    // 等待所有命令执行完毕
}

/******************************************************************************
 * 函数原型: void EEPROMEraseSectData(void *addr, int data);                  *
 * 功能: EEPROM扇区擦除具体步骤                                               *
 * 说明: 扇区擦除的具体步骤须严格遵守(详见EETS2K Block User Guide V01.03 P28) *
 ******************************************************************************/
void EEPROMEraseSectData (void *addr, int data)
{
	EEPROMWaitForCmdEmpty();
	*(int *)((int)addr & 0xFFFC) = data;                   // 扇区擦除时忽略地址的低2位
	ECMD = EEPROMCmdEraseSect;                             // 发出扇区擦除命令
	EEPROMWaitForCmdComplete();
}

/******************************************************************************
 * 函数原型: void EEPROMEraseSect(void *addr);                                *
 * 功能: EEPROM扇区擦除                                                       *
 * 说明: 扇区擦除时,数据字节的值无关紧要,这里使用0xFFFF                       *
 ******************************************************************************/
void EEPROMEraseSect (void *addr)
{
	EEPROMEraseSectData(addr,0xFFFF);
}

/******************************************************************************
 * 函数原型: long EEPROMRead4BAligned(void *addr);                            *
 * 功能: 从指定的地址读取1个长字                                              *
 * 说明: 无                                                                   *
 ******************************************************************************/
long EEPROMRead4BAligned (void *addr)
{
	return *(long *)((int)addr & 0xFFFC);
}

/******************************************************************************
 * 函数原型: void EEPROMWrite4BAligned(void *addr, long data);                *
 * 功能: 向指定的地址写入1个长字                                              *
 * 说明: 无                                                                   *
 ******************************************************************************/
void EEPROMWrite4BAligned (void *addr, long data)
{
	EEPROMDataUnion sav;
	sav.longint = data;
	((int *)((int)addr & 0xFFFC))[0] = sav.shortint[0];
	ECMD = EEPROMCmdProgram;
	EEPROMWaitForCmdComplete();
	((int *)((int)addr & 0xFFFC))[1] = sav.shortint[1];
	ECMD = EEPROMCmdProgram;
	EEPROMWaitForCmdComplete();
}

/******************************************************************************
 * 函数原型: void EEPROMEraseWrite4BAligned(void *addr, long data);           *
 * 功能: 擦除指定地址的扇区并向其中写入1个长字                                *
 * 说明: 无                                                                   *
 ******************************************************************************/
void EEPROMEraseWrite4BAligned (void *addr, long data)
{
	EEPROMEraseSect(addr);
	EEPROMWrite4BAligned(addr,data);
}

/******************************************************************************
 * 函数原型: int EEPROMRead2BAligned(void *addr);                             *
 * 功能: 从EEPROM指定地址中读取1个字                                          *
 * 说明: 无                                                                   *
 ******************************************************************************/
int EEPROMRead2BAligned (void *addr)
{
	return *(int *)((int)addr & 0xFFFE);
}

/******************************************************************************
 * 函数原型: void EEPROMWrite2BAligned(void *addr, int data);                 *
 * 功能: 向EEPROM的指定地址写入1个字                                          *
 * 说明: 无                                                                   *
 ******************************************************************************/
void EEPROMWrite2BAligned (void *addr, int data)
{
	*(int *)((int)addr & 0xFFFE) = data;
	ECMD = EEPROMCmdProgram;
	EEPROMWaitForCmdComplete();
}

/******************************************************************************
 * 函数原型: void EEPROMEraseWrite2BAligned(void *addr, int data);            *
 * 功能: 向指定的地址写入1个字                                                *
 * 说明: 注意本函数的实现方法                                                 *
 ******************************************************************************/
void EEPROMEraseWrite2BAligned (void *addr, int data)
{
	EEPROMDataUnion sav;
	sav.longint = EEPROMRead4BAligned(addr);
	EEPROMEraseSect(addr);
	sav.shortint[((int)addr >> 1) & 0x0001] = data;
	EEPROMWrite4BAligned(addr,sav.longint);
}

/******************************************************************************
 * 函数原型: void EEPROMEraseWrite1B(void *addr, char data);                  *
 * 功能: 向指定的地址写入1个字节                                              *
 * 说明: 注意本函数的实现方法                                                 *
 ******************************************************************************/
void EEPROMEraseWrite1B (void *addr, char data)
{
	EEPROMDataUnion sav;
	sav.longint = EEPROMRead4BAligned(addr);
	sav.byte[(int)addr & 0x0003] = data;
	EEPROMEraseWrite4BAligned(addr,sav.longint);
}

/******************************************************************************
 * 函数原型: void __memmovebufforlittle(void *p, int m, int len);             *
 * 功能: 数据块移动形式1                                                      *
 * 说明: 注意本函数与下一个函数的比较                                         *
 ******************************************************************************/
void __memmovebufforlittle (void *p, int m, int len)
{
	int i;
    for(i = 0; i < len; i++)
		((char *)p)[i] = ((char *)p)[i+m];
}

/******************************************************************************
 * 函数原型: void __memmovebufforlarge(void *p, int m, int len);              *
 * 功能: 数据块移动形式2                                                      *
 * 说明: 注意本函数与上一函数的比较                                           *
 ******************************************************************************/
void __memmovebufforlarge (void *p, int m, int len)
{
	int i;
    for(i = len-1; i >= 0; i--)
		((char *)p)[i+m] = ((char *)p)[i];
}

/******************************************************************************
 * 函数原型: void __memmovebuf(void *p, int m, int len);                      *
 * 功能: 数据快移动                                                           *
 * 说明: 无                                                                   *
 ******************************************************************************/
void __memmovebuf (void *p, int m, int len)
{
	if(m > 0)
		__memmovebufforlittle(p,m,len);
	if(m < 0)
		__memmovebufforlarge(p,-m,len);
}

/******************************************************************************
 * 函数原型: void InitLowLevel(void);                                         *
 * 功能: 单片机底层操作的初始化                                               *
 * 说明: 无                                                                   *
 ******************************************************************************/
void InitLowLevel (void)
{
	DisableInterrupts;
	InitTim();
	InitRealTime();
	InitPortInOut();
	InitUART0();
	InitUART1();
	InitATD();
	InitSoftUART2();
	InitEEPROM();
	EnableInterrupts;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -