打印

求助:在CAN接收中断子程序中不能往usb发送数据吗

[复制链接]
2908|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dongjiajia|  楼主 | 2012-4-26 18:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我现在想将CAN节点接收到的数据通过pc机,思路是在CAN接收子程序中将收到的数据写到usb发送buffer里,我通过windriver设计的界面可以看到接收的都是乱码,完全跟发送的数据没有关系。但是接收的数据个数是正确的。
沙发
dongjiajia|  楼主 | 2012-4-26 18:27 | 只看该作者
void CAN1_RX0_IRQHandler(void)
{
  CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
  STM_EVAL_LEDOn(LED1);//将接受到的数据全部发给usb
  
  CAN_to_USB_SendData(&RxMessage);
  

}

使用特权

评论回复
板凳
dongjiajia|  楼主 | 2012-4-26 18:30 | 只看该作者
void CAN_to_USB_SendData(CanRxMsg* RxMessage)
{
  uint8_t CANRxMessage[16];
uint8_t count;
  
if (RxMessage->IDE == CAN_ID_STD)
  {
   CANRxMessage[0] = (uint8_t)0xFF &  RxMessage->StdId;
   printf("IDE的第1位CANRxMessage[0]=%d \r\n",CANRxMessage[0]);

   CANRxMessage[1] = (uint8_t)0xFF &  (RxMessage->StdId >> 8);
   printf("IDE的第2位CANRxMessage[1]=%d \r\n",CANRxMessage[1]);

   CANRxMessage[2] = (uint8_t)0xFF &  (RxMessage->StdId >> 16);
   printf("IDE的第3位CANRxMessage[2]=%d \r\n",CANRxMessage[2]);

   CANRxMessage[3] = (uint8_t)0xFF &  (RxMessage->StdId >> 24);
   printf("IDE的第4位CANRxMessage[3]=%d \r\n",CANRxMessage[3]);
  }
  else
  {
    CANRxMessage[0] = (uint8_t)0xFF &  RxMessage->ExtId;
        printf("EXT的第1位CANRxMessage[0]=%d \r\n",CANRxMessage[0]);

    CANRxMessage[1] = (uint8_t)0xFF &  (RxMessage->ExtId >> 8);
        printf("EXT的第1位CANRxMessage[1]=%d \r\n",CANRxMessage[1]);

    CANRxMessage[2] = (uint8_t)0xFF &  (RxMessage->ExtId >> 16);
        printf("EXT的第2位CANRxMessage[2]=%d \r\n",CANRxMessage[2]);

    CANRxMessage[3] = (uint8_t)0xFF &  (RxMessage->ExtId >> 24);
        printf("EXT的第3位CANRxMessage[3]=%d \r\n",CANRxMessage[3]);
  }
  /* Get the FMI */
  CANRxMessage[4]=RxMessage->FMI;
  printf("FMI=%d \r\n",CANRxMessage[4]);

   CANRxMessage[5]=RxMessage->RTR;
   printf("RTR=%d \r\n",CANRxMessage[5]);

   CANRxMessage[6]=RxMessage->IDE;
   printf("IDE=%d \r\n",CANRxMessage[6]);

  /* Get the DLC */
   CANRxMessage[7]=RxMessage->DLC;
   printf("DLC=%d \r\n",CANRxMessage[7]);


  for(count=0;count<(RxMessage->DLC);count++)
  {
     CANRxMessage[count+8]=RxMessage->Data[count];
         printf("DATA:[%d]=%d \r\n",count,CANRxMessage[count+8]);
  }          
  if  (bDeviceState == CONFIGURED)
  //RxMessage  是一个结构体,buffer参数是一个8位的数组指针,要进行数据的转换
  {
   USB_SIL_Write(EP1_IN,CANRxMessage,RxMessage->DLC+8);
  }
  
#ifndef STM32F10X_CL
  /* Enable endpoint for transmission */
  SetEPTxValid(ENDP1);
#endif /* STM32F10X_CL */

}

使用特权

评论回复
地板
airwill| | 2012-4-26 22:46 | 只看该作者
请仔细看数据手册
RM0008 Reference Manual 第10中译版 424/754 有下面这段文字.
注:  在中容量和大容量产品中,USB和CAN共用一个专用的512字节的SRAM存储器用于数据的发送
和接收,因此不同同时使用USB和CAN(共享的SRAM被USB和CAN模块互斥地访问)。USB和
CAN可以同时用于一个应用中但不能在同一个时间使用。

使用特权

评论回复
5
dongjiajia|  楼主 | 2012-4-27 08:40 | 只看该作者
可我的是互联性产品stm32f107

使用特权

评论回复
6
dongjiajia|  楼主 | 2012-4-27 08:47 | 只看该作者
他们不存在共享SRAM的问题,能把RM0008 Reference Manual 中译版发给我一份吗,我只有英文版的,我的邮箱是dongjia20060773@126.com,非常的感谢!

使用特权

评论回复
7
airwill| | 2012-4-27 10:37 | 只看该作者
8
dongjiajia|  楼主 | 2012-4-27 11:06 | 只看该作者
你上面的链接我打不开呀

使用特权

评论回复
9
dongjiajia|  楼主 | 2012-4-27 11:13 | 只看该作者
我进入那个页面时,页面报错说该文件不是一个pdf文件,改文件已被损坏,无法下载!
你能把你下载的发一份到我邮箱吗,谢了!

使用特权

评论回复
10
vigia| | 2012-4-27 16:42 | 只看该作者
LZ你用的是V3.3.0的USB库吧,试试V2.1.0的stm32_f105-07_f2xx_usb-host-device_lib库吧,这个库是专门针对OTG_FS模块的。

使用特权

评论回复
11
dongjiajia|  楼主 | 2012-4-27 18:30 | 只看该作者
不是库的原因吧

使用特权

评论回复
12
airwill| | 2012-4-28 08:44 | 只看该作者
奇怪, 我怎么一点击,马上就出现要保存的页面.
我测试了一下, 能下载, 下来的文件也是完全正常的!
不行, 你到 ST 的官方网站去下载吧

使用特权

评论回复
13
logokfu| | 2012-4-28 08:48 | 只看该作者
就是这个手册而已。我替楼主发上来。三个需要都下载下来才能解压。

STM32F10xxx用户手册.part1.rar (4.77 MB)
STM32F10xxx用户手册.part2.rar (4.77 MB)
STM32F10xxx用户手册.part3.rar (1.11 MB)

使用特权

评论回复
14
dongjiajia|  楼主 | 2012-4-30 09:30 | 只看该作者
非常感谢!

使用特权

评论回复
15
LuoR| | 2015-11-13 09:16 | 只看该作者
楼主你好,请问CAN通过USB发送的程序能邮件我吗  2270404527@qq.com

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

66

帖子

0

粉丝