SJA1000 CAN驱动程序演示实验
interrupt 0
** 功能描述: SJA1000 中断响应函数
***************************************************************/
void SJA1000_INT0(void) interrupt 0
{
OS_INT_ENTER();
EX0 = 0;
OSIntSendSignal(0); //无条件的令CAN 接收中断处理任务(CAN_Rcv ())处于就绪状
态
//由于CAN_Rcv ()的优先级最高,故中断退出后立刻执行
CAN_Rcv ().
OSIntExit();
}
void main(void)
{
uint8 i ;
OSInit();
Init();
CAN_Init();
//初始化显示缓存
for(i=0;i<8;i++)
{
disp_buf[i]=31;
}
//创建任务
OSTaskCreate(CAN_Rcv, NULL, 0);
OSTaskCreate(display, NULL, 1);
OSTaskCreate(CAN_Send, NULL, 2);
OSTaskCreate(TimeSum, NULL, 3);
while(1)
{
PCON = PCON | 0x01; //令CPU 进入睡眠状态
}
}
/*****************************************************************
**键值发送任务
*****************************************************************/
void CAN_Send(void)
{
uint8 key_data;
while(1)
{
key_data = ZLG7290_GetKey();
if(key_data)
{
Send_CAN_Data[3] = key_data;
CAN_Data_Send();
disp_buf[4] = key_data % 10;
disp_buf[5] = (key_data / 10) % 10;
}
OSWait(K_TMO,5);
}
}
/****************************************************************
**显示任务
*****************************************************************/
void display(void)
{
while(1)
{
OSWait(K_TMO,5);
OS_ENTER_CRITICAL();
ZLG7290_SendBuf(&disp_buf[0], 8);
OS_EXIT_CRITICAL();
}
}
/***************************************************************
**CAN 接收中断处理任务
***************************************************************/
void CAN_Rcv(void)
{
while(1)
{
OSWait(K_SIG, 0); //挂起当前任务,等待唤醒信号
if(ReadSJAReg(REG_CAN_IR)&0x01)
{
//数据接收一定在释放缓冲区之前,释放后数据不确定
ReadSJARegBlock(16,Recv_CAN_Data,13);
WriteSJAReg(REG_CAN_CMR,4); //释放SJA1000 接收缓冲区
disp_buf[0] = Recv_CAN_Data[3] % 10;
disp_buf[1] = (Recv_CAN_Data[3] / 10) % 10;
}
EX0 = 1;
}
}
/*****************************************************
* *计数任务
***************************************************************/
void TimeSum(void)
{
while(1)
{
OSWait(K_TMO, 5);
disp_buf[7]++;
if(disp_buf[7] > 9)
{
disp_buf[7] = 0;
}
}
}
五.实验例程简析
本驱动程序采用中断方式接收CAN 总线数据。采用中断的方式,可以提高系统的实时性。特别的在接收数据的时候,采用中断方式可以在效率和实时性上比采用非中断方式得到很大的提高。
按下D5 区的按键时,左边的LED 将显示按键键值,同时程序调用CAN_Data_Send ( )
将检测到的键值通过CAN 总线发送到另一台实验仪上。实验仪将从CAN 总线上接收到的
键值数据显示在D5 区的右边LED 上。
D5 区中最右边的LED 管循环地显示0~9,目的是为了显示系统正在运行。
有关SJA1000_PEI 库的使用请阅读配套光盘中的《SJA1000_PEI 库说明及其使用》文档。
SJA1000CAN驱动程序演示实 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)