Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
2345VOR
rt-thread
提交
2fffc07d
R
rt-thread
项目概览
2345VOR
/
rt-thread
与 Fork 源项目一致
Fork自
RT-Thread / rt-thread
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rt-thread
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
2fffc07d
编写于
7月 08, 2015
作者:
B
Bernard Xiong
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #516 from AubrCool/master
bxcan 适应新改的驱动
上级
c4175167
6fad73c9
变更
2
展开全部
隐藏空白更改
内联
并排
Showing
2 changed file
with
1282 addition
and
1015 deletion
+1282
-1015
bsp/stm32f10x/applications/canapp.c
bsp/stm32f10x/applications/canapp.c
+193
-82
bsp/stm32f10x/drivers/bxcan.c
bsp/stm32f10x/drivers/bxcan.c
+1089
-933
未找到文件。
bsp/stm32f10x/applications/canapp.c
浏览文件 @
2fffc07d
...
...
@@ -8,29 +8,129 @@
* http://www.rt-thread.org/license/LICENSE
*
* Change Logs:
* Date Author
Notes
* 2015-05-14 aubrcool@qq.com
first version
* Date Author
Notes
* 2015-05-14 aubrcool@qq.com
first version
*/
#ifdef RT_USING_CAN
#include <board.h>
#include <rtthread.h>
#include <rtdevice.h>
#ifdef RT_USING_CAN
#define CANRT1 8
#define CANERR1 9
#define CANRT2 37
#define CANERR2 38
static
struct
canledtype
{
struct
stm32_hw_pin_userdata
rtd
;
struct
stm32_hw_pin_userdata
err
;
}
canled
[]
=
{
#ifdef USING_BXCAN1
{
{
CANRT1
,
PIN_MODE_OUTPUT_OD
,},
{
CANERR1
,
PIN_MODE_OUTPUT_OD
,},
},
#endif
/*USING_BXCAN1*/
#ifdef USING_BXCAN2
{
{
CANRT2
,
PIN_MODE_OUTPUT_OD
,},
{
CANERR2
,
PIN_MODE_OUTPUT_OD
,},
},
#endif
/*USING_BXCAN2*/
};
void
can_bus_hook
(
struct
rt_can_device
*
can
,
struct
canledtype
*
led
)
{
if
(
can
->
timerinitflag
==
1
)
{
rt_pin_write
(
led
->
rtd
.
pin
,
0
);
}
else
{
if
(
can
->
status
.
rcvchange
==
1
||
can
->
status
.
sndchange
==
1
)
{
can
->
status
.
rcvchange
=
0
;
can
->
status
.
sndchange
=
0
;
rt_pin_write
(
led
->
rtd
.
pin
,
rt_pin_read
(
led
->
rtd
.
pin
)
?
0
:
1
);
}
else
{
rt_pin_write
(
led
->
rtd
.
pin
,
1
);
}
}
if
(
can
->
timerinitflag
==
1
)
{
rt_pin_write
(
led
->
err
.
pin
,
0
);
}
else
{
if
(
can
->
status
.
errcode
)
{
rt_pin_write
(
led
->
err
.
pin
,
0
);
}
else
{
rt_pin_write
(
led
->
err
.
pin
,
1
);
}
}
}
#ifdef USING_BXCAN1
void
can1_bus_hook
(
struct
rt_can_device
*
can
)
{
static
rt_int32_t
inited
=
0
;
if
(
!
inited
)
{
inited
=
1
;
rt_pin_mode
(
canled
[
0
].
rtd
.
pin
,
canled
[
0
].
rtd
.
mode
);
rt_pin_mode
(
canled
[
0
].
err
.
pin
,
canled
[
0
].
err
.
mode
);
}
can_bus_hook
(
can
,
&
canled
[
0
]);
}
#endif
/*USING_BXCAN1*/
#ifdef USING_BXCAN2
void
can2_bus_hook
(
struct
rt_can_device
*
can
)
{
static
rt_int32_t
inited
=
0
;
if
(
!
inited
)
{
inited
=
1
;
rt_pin_mode
(
canled
[
1
].
rtd
.
pin
,
canled
[
1
].
rtd
.
mode
);
rt_pin_mode
(
canled
[
1
].
err
.
pin
,
canled
[
1
].
err
.
mode
);
}
can_bus_hook
(
can
,
&
canled
[
1
]);
}
#endif
/*USING_BXCAN2*/
int
can_bus_hook_init
(
void
)
{
rt_device_t
candev
;
#ifdef USING_BXCAN1
candev
=
rt_device_find
(
"bxcan1"
);
RT_ASSERT
(
candev
);
rt_device_control
(
candev
,
RT_CAN_CMD_SET_BUS_HOOK
,
(
void
*
)
can1_bus_hook
);
#endif
/*USING_BXCAN1*/
#ifdef USING_BXCAN2
candev
=
rt_device_find
(
"bxcan2"
);
RT_ASSERT
(
candev
);
rt_device_control
(
candev
,
RT_CAN_CMD_SET_BUS_HOOK
,
(
void
*
)
can2_bus_hook
);
#endif
/*USING_BXCAN2*/
return
RT_EOK
;
}
INIT_DEVICE_EXPORT
(
can_bus_hook_init
);
struct
can_app_struct
{
const
char
*
name
;
const
char
*
name
;
struct
rt_event
event
;
struct
rt_can_filter_config
*
filter
;
struct
rt_can_filter_config
*
filter
;
rt_uint8_t
eventopt
;
};
static
struct
can_app_struct
can_data
[
2
];
static
rt_err_t
can1ind
(
rt_device_t
dev
,
void
*
args
,
rt_int32_t
hdr
,
rt_size_t
size
)
static
rt_err_t
can1ind
(
rt_device_t
dev
,
void
*
args
,
rt_int32_t
hdr
,
rt_size_t
size
)
{
rt_event_t
pevent
=
(
rt_event_t
)
args
;
rt_event_send
(
pevent
,
1
<<
(
hdr
));
return
RT_EOK
;
}
static
rt_err_t
can2ind
(
rt_device_t
dev
,
void
*
args
,
rt_int32_t
hdr
,
rt_size_t
size
)
static
rt_err_t
can2ind
(
rt_device_t
dev
,
void
*
args
,
rt_int32_t
hdr
,
rt_size_t
size
)
{
rt_event_t
pevent
=
(
rt_event_t
)
args
;
rt_event_send
(
pevent
,
1
<<
(
hdr
));
...
...
@@ -38,106 +138,117 @@ static rt_err_t can2ind(rt_device_t dev, void* args, rt_int32_t hdr, rt_size_t
}
struct
rt_can_filter_item
filter1item
[
4
]
=
{
RT_CAN_FILTER_STD_INIT
(
1
,
can1ind
,
&
can_data
[
0
].
event
),
RT_CAN_FILTER_STD_INIT
(
2
,
can1ind
,
&
can_data
[
0
].
event
),
RT_CAN_STD_RMT_FILTER_INIT
(
3
,
can1ind
,
&
can_data
[
0
].
event
),
RT_CAN_STD_RMT_DATA_FILTER_INIT
(
4
,
can1ind
,
&
can_data
[
0
].
event
),
RT_CAN_FILTER_STD_INIT
(
1
,
can1ind
,
&
can_data
[
0
].
event
),
RT_CAN_FILTER_STD_INIT
(
2
,
can1ind
,
&
can_data
[
0
].
event
),
RT_CAN_STD_RMT_FILTER_INIT
(
3
,
can1ind
,
&
can_data
[
0
].
event
),
RT_CAN_STD_RMT_DATA_FILTER_INIT
(
4
,
can1ind
,
&
can_data
[
0
].
event
),
};
struct
rt_can_filter_item
filter2item
[
4
]
=
{
RT_CAN_FILTER_STD_INIT
(
1
,
can2ind
,
&
can_data
[
1
].
event
),
RT_CAN_FILTER_STD_INIT
(
2
,
can2ind
,
&
can_data
[
1
].
event
),
RT_CAN_STD_RMT_FILTER_INIT
(
3
,
can2ind
,
&
can_data
[
1
].
event
),
RT_CAN_STD_RMT_DATA_FILTER_INIT
(
4
,
can2ind
,
&
can_data
[
1
].
event
),
RT_CAN_FILTER_STD_INIT
(
1
,
can2ind
,
&
can_data
[
1
].
event
),
RT_CAN_FILTER_STD_INIT
(
2
,
can2ind
,
&
can_data
[
1
].
event
),
RT_CAN_STD_RMT_FILTER_INIT
(
3
,
can2ind
,
&
can_data
[
1
].
event
),
RT_CAN_STD_RMT_DATA_FILTER_INIT
(
4
,
can2ind
,
&
can_data
[
1
].
event
),
};
struct
rt_can_filter_config
filter1
=
{
.
count
=
4
,
.
actived
=
1
,
.
items
=
filter1item
,
.
count
=
4
,
.
actived
=
1
,
.
items
=
filter1item
,
};
struct
rt_can_filter_config
filter2
=
{
.
count
=
4
,
.
actived
=
1
,
.
items
=
filter2item
,
.
count
=
4
,
.
actived
=
1
,
.
items
=
filter2item
,
};
static
struct
can_app_struct
can_data
[
2
]
=
{
static
struct
can_app_struct
can_data
[
2
]
=
{
{
.
name
=
"bxcan1"
,
.
filter
=
&
filter1
,
.
eventopt
=
RT_EVENT_FLAG_OR
|
RT_EVENT_FLAG_CLEAR
,
.
name
=
"bxcan1"
,
.
filter
=
&
filter1
,
.
eventopt
=
RT_EVENT_FLAG_OR
|
RT_EVENT_FLAG_CLEAR
,
},
{
.
name
=
"bxcan2"
,
.
filter
=
&
filter2
,
.
eventopt
=
RT_EVENT_FLAG_AND
|
RT_EVENT_FLAG_CLEAR
,
.
name
=
"bxcan2"
,
.
filter
=
&
filter2
,
.
eventopt
=
RT_EVENT_FLAG_AND
|
RT_EVENT_FLAG_CLEAR
,
},
};
void
rt_can_thread_entry
(
void
*
parameter
)
void
rt_can_thread_entry
(
void
*
parameter
)
{
struct
rt_can_msg
msg
;
struct
can_app_struct
*
canpara
=
(
struct
can_app_struct
*
)
parameter
;
rt_device_t
candev
;
rt_uint32_t
e
;
struct
rt_can_msg
msg
;
struct
can_app_struct
*
canpara
=
(
struct
can_app_struct
*
)
parameter
;
rt_device_t
candev
;
rt_uint32_t
e
;
candev
=
rt_device_find
(
canpara
->
name
);
RT_ASSERT
(
candev
);
rt_event_init
(
&
canpara
->
event
,
canpara
->
name
,
RT_IPC_FLAG_FIFO
);
rt_device_open
(
candev
,
(
RT_DEVICE_OFLAG_RDWR
|
RT_DEVICE_FLAG_INT_RX
|
RT_DEVICE_FLAG_INT_TX
));
rt_device_control
(
candev
,
RT_CAN_CMD_SET_FILTER
,
canpara
->
filter
);
while
(
1
)
{
if
(
rt_event_recv
(
&
canpara
->
event
,
((
1
<<
canpara
->
filter
->
items
[
0
].
hdr
)
|
(
1
<<
canpara
->
filter
->
items
[
1
].
hdr
)
|
(
1
<<
canpara
->
filter
->
items
[
2
].
hdr
)
|
(
1
<<
canpara
->
filter
->
items
[
3
].
hdr
)),
canpara
->
eventopt
,
RT_WAITING_FOREVER
,
&
e
)
!=
RT_EOK
)
{
continue
;
}
if
(
e
&
(
1
<<
canpara
->
filter
->
items
[
0
].
hdr
))
{
msg
.
hdr
=
canpara
->
filter
->
items
[
0
].
hdr
;
while
(
rt_device_read
(
candev
,
0
,
&
msg
,
sizeof
(
msg
))
==
sizeof
(
msg
))
{
rt_device_write
(
candev
,
0
,
&
msg
,
sizeof
(
msg
));
}
}
if
(
e
&
(
1
<<
canpara
->
filter
->
items
[
1
].
hdr
))
{
msg
.
hdr
=
canpara
->
filter
->
items
[
1
].
hdr
;
while
(
rt_device_read
(
candev
,
0
,
&
msg
,
sizeof
(
msg
))
==
sizeof
(
msg
))
{
rt_device_write
(
candev
,
0
,
&
msg
,
sizeof
(
msg
));
}
}
if
(
e
&
(
1
<<
canpara
->
filter
->
items
[
2
].
hdr
))
{
msg
.
hdr
=
canpara
->
filter
->
items
[
2
].
hdr
;
while
(
rt_device_read
(
candev
,
0
,
&
msg
,
sizeof
(
msg
))
==
sizeof
(
msg
))
{
rt_device_write
(
candev
,
0
,
&
msg
,
sizeof
(
msg
));
}
}
if
(
e
&
(
1
<<
canpara
->
filter
->
items
[
3
].
hdr
))
{
msg
.
hdr
=
canpara
->
filter
->
items
[
3
].
hdr
;
while
(
rt_device_read
(
candev
,
0
,
&
msg
,
sizeof
(
msg
))
==
sizeof
(
msg
))
{
rt_device_write
(
candev
,
0
,
&
msg
,
sizeof
(
msg
));
}
}
}
candev
=
rt_device_find
(
canpara
->
name
);
RT_ASSERT
(
candev
);
rt_event_init
(
&
canpara
->
event
,
canpara
->
name
,
RT_IPC_FLAG_FIFO
);
rt_device_open
(
candev
,
(
RT_DEVICE_OFLAG_RDWR
|
RT_DEVICE_FLAG_INT_RX
|
RT_DEVICE_FLAG_INT_TX
));
rt_device_control
(
candev
,
RT_CAN_CMD_SET_FILTER
,
canpara
->
filter
);
while
(
1
)
{
if
(
rt_event_recv
(
&
canpara
->
event
,
((
1
<<
canpara
->
filter
->
items
[
0
].
hdr
)
|
(
1
<<
canpara
->
filter
->
items
[
1
].
hdr
)
|
(
1
<<
canpara
->
filter
->
items
[
2
].
hdr
)
|
(
1
<<
canpara
->
filter
->
items
[
3
].
hdr
)),
canpara
->
eventopt
,
RT_WAITING_FOREVER
,
&
e
)
!=
RT_EOK
)
{
continue
;
}
if
(
e
&
(
1
<<
canpara
->
filter
->
items
[
0
].
hdr
))
{
msg
.
hdr
=
canpara
->
filter
->
items
[
0
].
hdr
;
while
(
rt_device_read
(
candev
,
0
,
&
msg
,
sizeof
(
msg
))
==
sizeof
(
msg
))
{
rt_device_write
(
candev
,
0
,
&
msg
,
sizeof
(
msg
));
}
}
if
(
e
&
(
1
<<
canpara
->
filter
->
items
[
1
].
hdr
))
{
msg
.
hdr
=
canpara
->
filter
->
items
[
1
].
hdr
;
while
(
rt_device_read
(
candev
,
0
,
&
msg
,
sizeof
(
msg
))
==
sizeof
(
msg
))
{
rt_device_write
(
candev
,
0
,
&
msg
,
sizeof
(
msg
));
}
}
if
(
e
&
(
1
<<
canpara
->
filter
->
items
[
2
].
hdr
))
{
msg
.
hdr
=
canpara
->
filter
->
items
[
2
].
hdr
;
while
(
rt_device_read
(
candev
,
0
,
&
msg
,
sizeof
(
msg
))
==
sizeof
(
msg
))
{
rt_device_write
(
candev
,
0
,
&
msg
,
sizeof
(
msg
));
}
}
if
(
e
&
(
1
<<
canpara
->
filter
->
items
[
3
].
hdr
))
{
msg
.
hdr
=
canpara
->
filter
->
items
[
3
].
hdr
;
while
(
rt_device_read
(
candev
,
0
,
&
msg
,
sizeof
(
msg
))
==
sizeof
(
msg
))
{
rt_device_write
(
candev
,
0
,
&
msg
,
sizeof
(
msg
));
}
}
}
}
int
rt_can_app_init
(
void
)
{
rt_thread_t
tid
;
tid
=
rt_thread_create
(
"canapp1"
,
rt_can_thread_entry
,
&
can_data
[
0
],
512
,
RT_THREAD_PRIORITY_MAX
/
3
-
1
,
20
);
rt_can_thread_entry
,
&
can_data
[
0
],
512
,
RT_THREAD_PRIORITY_MAX
/
3
-
1
,
20
);
if
(
tid
!=
RT_NULL
)
rt_thread_startup
(
tid
);
tid
=
rt_thread_create
(
"canapp2"
,
rt_can_thread_entry
,
&
can_data
[
1
],
512
,
RT_THREAD_PRIORITY_MAX
/
3
-
1
,
20
);
rt_can_thread_entry
,
&
can_data
[
1
],
512
,
RT_THREAD_PRIORITY_MAX
/
3
-
1
,
20
);
if
(
tid
!=
RT_NULL
)
rt_thread_startup
(
tid
);
return
0
;
}
...
...
bsp/stm32f10x/drivers/bxcan.c
浏览文件 @
2fffc07d
此差异已折叠。
点击以展开。
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录