void can_recv_thread(void* parameter)
{
recv_sem = rt_sem_create("recvsem", 0, RT_IPC_FLAG_FIFO);
tran_sem = rt_sem_create("transem", 0, RT_IPC_FLAG_FIFO);
can_slave_init();
test_slave();
/* Infinite loop*/
while(1)
{
rt_sem_take(recv_sem, RT_WAITING_FOREVER);
{
uint32_t next;
Message *pmsg;
next = rx_read;
pmsg = &rx_msg_buf[next];
/* Disable the Interrupt sources */
TIM5->DIER &= (uint16_t)~TIM_IT_CC1;
canDispatch(&TestSlave_Data, pmsg);
/* Enable the Interrupt sources */
TIM5->DIER |= TIM_IT_CC1;
next++;
if(next >= RX_BUF_LEN) next = 0;
rx_read = next;
}
}
}
void TIM5_IRQHandler(void)
{
uint16_t capture = 0;
if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)
{
TIM_ClearITPendingBit(TIM5, TIM_IT_CC1);
last_time_set = TIM_GetCounter(TIM5);
TimeDispatch();
}
}
void USB_LP_CAN1_RX0_IRQHandler(void)
{
{
Message *pmsg;
uint32_t i, next;
CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
next = (rx_save + 1) ;
if(next >= RX_BUF_LEN) next = 0;
if(next == rx_read) return;
pmsg = &rx_msg_buf[rx_save];
/**< message's ID */
pmsg->cob_id = (UNS16)RxMessage.StdId;
/**< remote transmission request.(0 if not rtr, 1 if rtr) */
if(RxMessage.RTR == CAN_RTR_REMOTE)
pmsg->rtr = 1;
else
pmsg->rtr = 0;
/**< message's length (0 to 8) */
pmsg->len = (UNS8)RxMessage.DLC;
for(i = 0; i < pmsg->len; i++)
pmsg->data
Free software CANopen framework
CanFestival focuses on providing an ANSI-C platform independent CANOpen? stack that can be built as master or slave nodes on PCs, Real-time IPCs, and Microcontrollers.
Runtime code is licensed LGPLv2, whereas accompanying developer tools are licensed GPLv2.
CanFestival was made free in 2001, and grow since thank to user community source code contributions.
非常好,非常好,大力支持
不知道lz后续时间如何,如果有可能希望能够把这块维护起来。另外关于CanOpen的实现,我得先看看它的许可证协议。
建议加个maillist吧,这样有什么问题也可以在邮件列表中沟通。
CAN是工业总线中极为常用的一种,我也希望RT-Thread在其中能够做好。
弱弱的问一句 工程中在哪里对CANfestival协议进行初始化的?协议入口怎么找不到?
同样的问题, 高手出来解释一下啊
CO_Data TestMaster_Data = CANOPEN_NODE_DATA_INITIALIZER(TesterMaster)
static int test_master(void)
{
if(strcmp(MasterBoard.baudrate, "none"))
{
TestMaster_Data.heartbeatError = TestMaster_heartbeatError;
TestMaster_Data.initialisation = TestMaster_initialisation;
TestMaster_Data.preOperational = TestMaster_preOperational;
TestMaster_Data.operational = TestMaster_operational;
TestMaster_Data.stopped = TestMaster_stopped;
TestMaster_Data.post_sync = TestMaster_post_sync;
TestMaster_Data.post_TPDO = TestMaster_post_TPDO;
TestMaster_Data.post_emcy = TestMaster_post_emcy;
TestMaster_Data.post_SlaveBootup=TestMaster_post_SlaveBootup;
}
// Start timer thread
StartTimerLoop(&InitNodes);
return 0;
}
setState(&TestMaster_Data, Initialisation);
setState(&TestMaster_Data, Operational);
masterSendNMTstateChange()
Step By Step 执行了一遍, 依然没有看到是如何启动的, Slave的启动大致如下: test_slave() - StartTimerLoop - TIM5_start() - TIM5_IRQHandler - TimeDispatch 但是始终没有看到是如何进入到 test_slave()的.
void can_recv_thread(void* parameter)
{
recv_sem = rt_sem_create("recvsem", 0, RT_IPC_FLAG_FIFO);
tran_sem = rt_sem_create("transem", 0, RT_IPC_FLAG_FIFO);
can_slave_init();
test_slave();
/* Infinite loop*/
while(1)
{
rt_sem_take(recv_sem, RT_WAITING_FOREVER);
{
uint32_t next;
Message *pmsg;
next = rx_read;
pmsg = &rx_msg_buf[next];
/* Disable the Interrupt sources */
TIM5->DIER &= (uint16_t)~TIM_IT_CC1;
canDispatch(&TestSlave_Data, pmsg);
/* Enable the Interrupt sources */
TIM5->DIER |= TIM_IT_CC1;
next++;
if(next >= RX_BUF_LEN) next = 0;
rx_read = next;
}
}
}
void can_send_thread(void *parameter)
{
while(1)
{
rt_sem_take(tran_sem, RT_WAITING_FOREVER);
{
uint32_t next;
uint8_t mailbox_no;
CanTxMsg *ptx_msg;
next = tx_read;
ptx_msg = &tx_msg_buf[next];
mailbox_no = CAN_Transmit(CAN1, ptx_msg);
if(mailbox_no != CAN_NO_MB)
{
next++;
if(next >= TX_BUF_LEN) next = 0;
tx_read = next;
}
else
{
rt_sem_release(tran_sem);
}
}
}
}
| /
- RT - Thread Operating System
/ | 1.0.2 build Jul 3 2013
2006 - 2011 Copyright by rt-thread team
rtc is not configured
please configure with set_date and set_time
finsh>>list_thread()
thread pri status sp stack size max used left tick error
-------- ---- ------- ---------- ---------- ---------- ---------- ---
tidle 0x1f ready 0x00000058 0x00000100 0x0000005c 0x00000019 000
tshell 0x14 ready 0x00000088 0x00000800 0x000001b0 0x00000008 000
Cantx 0x08 init 0x00000040 0x00000800 0x00000040 0x00000014 000
Canrx 0x08 init 0x00000040 0x00000800 0x00000040 0x00000014 000
led 0x14 suspend 0x00000078 0x00000200 0x00000078 0x00000005 000
0, 0x00000000
softwind,Test打头的数据字典文件是怎么用Beremiz生成的??我下载了Beremiz相关的软件,但还是摸不着头脑,本人比较笨,望指点
我想问的是关于STM32定时器5的使用问题,在定时器发生中断里面读取定时器计数器的值,这个值在定时中断发生时就已经复位了呀,但是还在中断里面读取的话,会不会一直是0呢?那这样还会有什么意义?
想更多的请教下您,不知道能否提供QQ或者其他的联系方式
看了下你的TestSlave.c只有TPDO的描述和映射分别映射到index 0x2000(SlaveMap1)以后, 没有RPDO的描述和映射关系。 好像你的映射关系都固定了,我现在想用SDO来配置可变PDO映射,不知道CANfestival是否支持,不知道从哪下手,我主站用的是CANpro协议分析软件,希望大神给予帮助......
有个问题,我现在使用的定时器计数器的位数是24位的,与源码及你用的STM32(定时器计数器为16位)都不一样,所以现在我产生心跳报文的时间不准备,尝试看了一下源码,不知道从哪部分下手改。希望能给予帮助,谢谢!
仔细看了rt-thread下的canopen实现代码,但是工程里,并没有初始化canopen的线程的建立啊?application里面也找不到与canopen的函数相关的任何痕迹,是还没有完成吗?
提供商业级canopen代码,协议栈是库形式的,应用的工程师直接可以调用函数,直接向相应的缓冲区放数据就可以完成CANOPEN通信开发。
提供文件:
1.试验例程(工程文件带协议栈库文件)
2.OD编辑软件
3.usbcan一个
4.说明书
邮箱:lyd0429@sina.com