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

[复制链接]
 楼主| 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可以同时用于一个应用中但不能在同一个时间使用。
 楼主| dongjiajia 发表于 2012-4-27 08:40 | 显示全部楼层
可我的是互联性产品stm32f107
 楼主| dongjiajia 发表于 2012-4-27 08:47 | 显示全部楼层
他们不存在共享SRAM的问题,能把RM0008 Reference Manual 中译版发给我一份吗,我只有英文版的,我的邮箱是dongjia20060773@126.com,非常的感谢!
airwill 发表于 2012-4-27 10:37 | 显示全部楼层
 楼主| dongjiajia 发表于 2012-4-27 11:06 | 显示全部楼层
你上面的链接我打不开呀
 楼主| dongjiajia 发表于 2012-4-27 11:13 | 显示全部楼层
我进入那个页面时,页面报错说该文件不是一个pdf文件,改文件已被损坏,无法下载!
你能把你下载的发一份到我邮箱吗,谢了!
vigia 发表于 2012-4-27 16:42 | 显示全部楼层
LZ你用的是V3.3.0的USB库吧,试试V2.1.0的stm32_f105-07_f2xx_usb-host-device_lib库吧,这个库是专门针对OTG_FS模块的。
 楼主| dongjiajia 发表于 2012-4-27 18:30 | 显示全部楼层
不是库的原因吧
airwill 发表于 2012-4-28 08:44 | 显示全部楼层
奇怪, 我怎么一点击,马上就出现要保存的页面.
我测试了一下, 能下载, 下来的文件也是完全正常的!
不行, 你到 ST 的官方网站去下载吧
logokfu 发表于 2012-4-28 08:48 | 显示全部楼层
就是这个手册而已。我替楼主发上来。三个需要都下载下来才能解压。

STM32F10xxx用户手册.part1.rar (4.77 MB, 下载次数: 7)
STM32F10xxx用户手册.part2.rar (4.77 MB, 下载次数: 7)
STM32F10xxx用户手册.part3.rar (1.11 MB, 下载次数: 6)
 楼主| dongjiajia 发表于 2012-4-30 09:30 | 显示全部楼层
非常感谢!
LuoR 发表于 2015-11-13 09:16 | 显示全部楼层
楼主你好,请问CAN通过USB发送的程序能邮件我吗  2270404527@qq.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

66

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

0

主题

66

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部