芯片解密|单片机解密|IC解密|芯片破解|芯片复制| PCB抄板|软件开发

飞芯科技-芯片解密|单片机解密|IC解密|芯片破解|芯片复制| PCB抄板|软件开发

STC32G单片机CAN通讯源程序IC解密

  1. IC解密#include <STC32G.H>
  2. IC解密#include <intrins.h>

  3. // CAN 相关寄存器定义(STC32G 内置)
  4. sfr CANCON  = 0x90;  // CAN 控制寄存器
  5. sfr CANSTA  = 0x91;  // CAN 状态寄存器
  6. sfr CANINT  = 0x92;  // CAN 中断寄存器
  7. sfr CANBTR0 = 0x93;  // 波特率配置0
  8. sfr CANBTR1 = 0x94;  // 波特率配置1
  9. sfr CANID   = 0x95;  // ID 寄存器(扩展帧需配合 CANID1/CANID2)
  10. sfr CANID1  = 0x96;
  11. sfr CANID2  = 0x97;
  12. sfr CANDAT  = 0x98;  // 数据寄存器
  13. sfr CANDAT1 = 0x99;
  14. sfr CANDAT2 = 0x9A;
  15. sfr CANDAT3 = 0x9B;
  16. sfr CANDAT4 = 0x9C;
  17. sfr CANDAT5 = 0x9D;
  18. sfr CANDAT6 = 0x9E;
  19. sfr CANDAT7 = 0x9F;

  20. // CAN 模式定义
  21. #define CAN_MODE_NORMAL   0x00  // 正常模式
  22. #define CAN_MODE_LOOPBACK 0x40  // 回环模式(自测)
  23. #define CAN_BAUD_500K     0x01  // 500kbps(8MHz晶振)

  24. // 全局变量
  25. unsigned char can_rx_buf[8];  // 接收缓冲区
  26. bit can_rx_flag = 0;          // 接收完成标志

  27. /**
  28. * @brief 系统初始化(8MHz晶振)
  29. */
  30. void Sys_Init(void)
  31. {
  32.     CLKSEL = 0x00;  // 选择外部晶振(8MHz)
  33.     _nop_();
  34.     _nop_();
  35. }

  36. /**
  37. * @brief CAN 初始化
  38. * @param mode: 工作模式(正常/回环)
  39. */
  40. void CAN_Init(unsigned char mode)
  41. {
  42.     // 1. 配置IO口(P1.0=CAN_TX,P1.1=CAN_RX)
  43.     P1M1 &= 0xFC; P1M0 |= 0x03;  // P1.0/P1.1 推挽输出
  44.     P1PU |= 0x03;                // 上拉使能
  45.    
  46.     // 2. 进入初始化模式
  47.     CANCON = 0x80;  // 置位INIT位,进入初始化模式
  48.     while(!(CANSTA & 0x80));     // 等待初始化模式确认
  49.    
  50.     // 3. 波特率配置(8MHz晶振 → 500kbps)
  51.     // 分频系数: BRP=0 → TQ = 1/(8MHz/(0+1)) = 0.125μs
  52.     // 同步段: 1TQ, 时间段1: 6TQ, 时间段2: 1TQ → 总8TQ
  53.     // 波特率 = 1/(8*0.125μs) = 1Mbps → 调整为500kbps(BRP=1)
  54.     CANBTR0 = 0x01;  // BRP[5:0] = 1 → 分频系数=2 → TQ=0.25μs
  55.     CANBTR1 = 0x1C;  // SJW=1TQ, BS1=6TQ, BS2=1TQ → 总8TQ → 500kbps
  56.    
  57.     // 4. 工作模式配置
  58.     CANCON = mode | 0x00;  // 清除INIT位,退出初始化模式
  59.     while(CANSTA & 0x80);  // 等待退出初始化模式
  60. }

  61. /**
  62. * @brief CAN 发送数据(标准帧,8字节)
  63. * @param id: 标准ID(11位)
  64. * @param data: 发送数据缓冲区
  65. * @param len: 数据长度(1-8)
  66. * @return 0:成功 1:失败
  67. */
  68. unsigned char CAN_Send(unsigned int id, unsigned char *data, unsigned char len)
  69. {
  70.     if(len > 8) len = 8;
  71.    
  72.     // 1. 等待发送缓冲区空闲
  73.     if(CANSTA & 0x08) return 1;  // 发送缓冲区忙
  74.    
  75.     // 2. 写入ID(标准帧,11位)
  76.     CANID = (id >> 3) & 0xFF;    // ID[10:3]
  77.     CANID1 = (id << 5) & 0xE0;   // ID[2:0]
  78.     CANID1 &= ~0x10;             // 标准帧(IDE=0)
  79.    
  80.     // 3. 写入数据长度
  81.     CANID1 |= len & 0x0F;        // DLC[3:0]
  82.    
  83.     // 4. 写入数据
  84.     CANDAT  = data[0];
  85.     CANDAT1 = data[1];
  86.     CANDAT2 = data[2];
  87.     CANDAT3 = data[3];
  88.     CANDAT4 = data[4];
  89.     CANDAT5 = data[5];
  90.     CANDAT6 = data[6];
  91.     CANDAT7 = data[7];
  92.    
  93.     // 5. 启动发送
  94.     CANCON |= 0x08;  // 置位TR位,启动发送
  95.     while(CANSTA & 0x08);       // 等待发送完成
  96.    
  97.     // 6. 检查发送结果
  98.     if(CANSTA & 0x10)
  99.     {
  100.         CANSTA &= ~0x10;  // 清除发送成功标志
  101.         return 0;
  102.     }



联系方式

地址:石家庄市新华区民族路77号华强广场D座2009
电话:0311-88816616/87087811
手机:13315190088
传真:0311-67901001
联系人:张工
网址:www.feixindz.com
邮箱:feixindz@163.com
微信:xinpianjiemi
QQ:527263666/568069805

在线客服
热线电话

企业微信