📄 readme.txt
字号:
ARM下加一个硬件驱动比较复杂,不象x86下比较标准,需要对bsp包做些改动。can卡驱动的改动主要在中断方面,因为它使用的是共享中断。只要把文件夹“BSP包中需要覆盖的文件”下的文件复制到bsp包下的相应位置下即可,改动都已完成。
这个驱动没有使用标准的ce驱动模式,做成了一个动态连结库的方式,但是由于使用了ISR中断模式,还是需要把中断服务程序导入CE内核中。
具体步骤是:先把bsp包的相应改动完成,然后重新编译整个操作系统,再把“中断服务程序”下的文件复制到当前的工作区目录下,把isrcsd.dll $(_FLATRELEASEDIR)\isrcsd.dll NK SHK 这一行添加到platform.bib文件的末尾,使它可以被加载到操作系统核心区中。mkae image,使设置生效。
这样,中断服务程序加载完成。
完成上述步骤后,可以开始使用驱动程序,方法比较简单,用户程序包含入文件夹“用户程序用到的头文件”提供的头文件,链接csddriver.lib文件。运行时要把csddriver.dll文件和用户程序一起复制到操作系统中一起运行。
接口函数介绍: pCAN_OPEN_INFO CSDInit(DWORD Index);
硬件初始化函数。
这个函数的参数是1或者2,作用是选择第几个can口,返回值是个数据结构指针,其他的操作函数需要它来作为参数。如果失败返回0
pCAN_OPEN_INFO CSDOpen(pCAN_OPEN_INFO pCSDHead);
打开can口函数,主要做些数据结构的初始化和打开驱动的守护线程。
这个函数的参数是init函数的返回值,它的返回值和参数相同,但是失败返回null。
DWORD CSDClose(pCAN_OPEN_INFO pCSDHead);
关闭can口函数,关闭所有的守护线程和释放数据结构,失败返回FALSE,成功返回TRUE。
DWORD CSDRead(
HANDLE pHead,
PUCHAR pTargetBuffer,
ULONG BufferLength
);
读数据函数,参数pHead是CSDInit函数的返回值,pTargetBuffer是所输出数据存放的缓冲区指针,BufferLength是希望读出的数据数量,返回值是实际读到的数据数量。
DWORD CSDWrite(
HANDLE pHead,
PUCHAR pSourceBytes,
ULONG NumberOfBytes
);
写数据函数,参数pHead是CSDInit函数的返回值,pSourceBytes是希望写入的数据存放的缓冲区指针,NumberOfBytes 是希望写入的数据。返回值是实际写入的数据数量。
由于驱动编写仓促,很多功能未完成,主要是写控制功能。另外,封包部分也未完成,这里的输入输出都是些实际写入写进寄存器的数据,格式是这样的:
要求输入输出的数据量都是13的倍数,驱动也是13个数据13个数据进行操作的,如果不是证书倍,可能出错。
每13个数据的格式如下:
typedef struct
{
unsigned char ff;
unsigned char id1;
unsigned char id2;
unsigned char id3;
unsigned char id4;
unsigned char data[8];
}CAN_RPACKET;
元素:
ff: 报文格式
第7位为1表示扩展格式,报文标识符为4个字节
为0表示标准格式,报文标识符为2个字节
第6位为1表示远程幀
为0表示数据幀
第0~3位表示报文数据长度
id1: 报文标识符1
id2: 报文标识符2
id3: 报文标识符3
id4: 报文标识符4
data[8]: 报文数据,报文数据最大长度为8
如有问题,请来电探讨。
增加一个函数:
CSDDRIVER_API DWORD CSDConfig(
pCAN_OPEN_INFO pHead,
CAN_PORTSTRUCT *ptrStruct
);
这个函数是用来设置CAN口的拨特率等设置信息。其参数*ptrStruct是一个数据结构,定义如下:
enum fil {SIN,DOU};
enum lis {LON,LOFF};
enum tes {TON,TOFF};
enum sle {SON,SOFF};
enum bau {B1000,B800,B500,B320,B250,B160,B125,B80,B40,B20,B10,B5};
typedef struct _CAN_PORTSTRUCT{
enum fil filter;
enum lis lis_on;
enum tes test;
enum sle sleep;
enum bau baud_rate;
unsigned char code1;
unsigned char code2;
unsigned char code3;
unsigned char code4;
unsigned char mask1;
unsigned char mask2;
unsigned char mask3;
unsigned char mask4;
}CAN_PORTSTRUCT;
元素:
filter: 报文接收筛选器模式:
SIN 一 单筛选器模式 默认
DOU 一 双筛选器模式
lis_on: 是否只听模式
LOFF 一 正常模式 默认
LON 一 只听模式
test: 是否自测模式
TOFF 一 正常模式 默认
TON 一 自测模式
Sleep: 是否睡眠模式
SOFF 一 正常模式 默认
SON 一 睡眠模式
baud_rate: 波特率
B1000 一 1000kbit/s B800 一 800kbit/s
B500 一 500kbit/s B320 一 320kbit/s
B250 一 250kbit/s 默认 B160 一 160kbit/s
B80 一 80kbit/s B40 一 40kbit/s
B20 一 20kbit/s B10 一 10kbit/s
B5 一 5kbit/s B125 一 125kbit/s
code1: 接收码寄存器1
code2: 接收码寄存器2
code3: 接收码寄存器3
code4: 接收码寄存器4
mask1: 接收屏蔽寄存器1
mask2: 接收屏蔽寄存器2
mask3: 接收屏蔽寄存器3
mask4: 接收屏蔽寄存器4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -