大亮
发表于 2023-10-15 14:05:25
预习玩转CAN总线 基于STC89C52单片机的开发板学习 STC89C52+SJA1000+TJA1050 支持CAN2.0A (11bit ID)和CAN2.0B(29bit ID)USB-》RS232-》串口-》STC板子控制成本
目标文件 支持ISP下载的51单片机 独立按键接在P3.2(int0)P3.3(int1)外部中断口 复位按键
SJA1000T CAN控制器 FIFO 并口(P0 : AD0~AD7) ISP复位模式 RST按钮复位 复位电路(PIN 9 RST)
CAN总线控制芯片 Philips SJA000 64K FIFOCAN总线驱动器Philips TJA1050 (收发器) RS232电平转换MAX232
继电器:弱点控制强电功能CAN-ENDER 120Ω
靠自己来摸索 版本2 版本4 USB转串口--虚拟串口
根据注释一条一条的看懂源代码,知道CAN总线开发的全部过程
帧结构:CAN2.0A 略 CAN2.0B扩展帧 29位寻址范围广、网络范围大
SJA1000 CAN 控制器的CAN 通讯波特率由寄存器BTR0、BTR1 晶振等参数共同决定。依据晶振查表,修改代码 波特率计算小软件
case ByteRate_125k: //SJA1000的晶振为必须为16MHZ,波特率设置为125kpbs
BTR0_num=0x03;
BTR1_num=0x1c;
滤波器:直接ID号进行滤波; 寄存器滤波
验收屏蔽寄存器:每一位对应每一位验收代码,改为屏蔽位为1,即无关,都会接收。AMR为0的位所对应的ACR位和参与滤波数据的对应位必须相同才算验收通过。
单滤波配置,一个长滤波器
ACR为1位,接收。 ACR 4个字节 ---29bit
双滤波配置,两个短滤波器
广播、组播、点播,灵活组网
多实践、多交流
独立的控制器芯片; 和微控制器做在一起,如Cortex-M0内核的xxxx微控制器
CAN总线报文格式:帧起始、仲裁场、控制场、数据场、CRC场、应答场、帧结尾
帧空间、总线空闲
位定时要求, 同步
位填充:足够多的跳变沿, 比特流编码:NRZ
总线错误类型:位、填充、形式、应答、CRC
错误标志: 检测到错误的站,发送错误标志,错误主动的节点、主动错误标志
故障界定:错误主动、错误被动、总线关闭 ERROR COUNTER 错误计数规则
总线拓扑结构: 中继器: 网桥: 集线器: 网关:(协议转换) 传输介质:双绞线,光纤 斜率控制: 介质接入仲裁,
网络延时, 通讯速率 速率一致性晶振频率,BTR1,BTR0 SJA1000的控制通过访问其内部寄存器来实现,不同操作模式的内部寄存器分分布不同,数据手册,对单片机SJA000似外部RAM器件:片选SJA1000,操作内部寄存器地址对其进行读、写操作控制
代码:头文件SJA1000.h中定义SJA1000相关特殊功能寄存器 #define SJA1000_BASE 0X7E00 unsigned char xdata CONTROL _at_ SJA1000_BASE+0X00;...
unsigned char xdata TxBuffer1 _at_ SJA1000_BASE+0X0A;...unsigned char xdata RxBuffer1 _at_ SJA1000_BASE+0X14;...unsigned char xdata *SJA1000_Address;
CAN通信基本函数 bit enter_RST (void); bit quit_RST (void); bit set_rate(unsigned char CAN_rate_num);bit set_ACR_AMR(unsigned char ACR_DATA,unsigned char AMR_DATA);bit set_CLK(unsigned char SJA_OUT_MODE, unsigned char SJA_Clock_Out);bit SJA_send_data(unsigned char *senddatabuf);bit SJA_rcv_data(unsigned char *rcvdatabuf);bit SJA_command_control(unsigned char order);宏定义操作的命令字;
子函数:将访问地址指向SJA1000的相应寄存器,保存原始值,操作原始值,赋值给访问地址,再判断一下是否成功
fclkout=fxtal/时钟分频因子(1 2 4 6 8 10 12 14)
大亮
发表于 2023-10-15 15:19:26
大亮
发表于 2023-10-16 15:47:43
嵌入式系统,比较特殊的计算机系统,基本构成硬件软件两部分。系统软件,再硬件和应用程序之间,通过提供应用程序接口API屏蔽了计算机硬件工作的一些细节,提高了应用程序的开发效率。裸机。主要功能,处理器的管理,中断和任务调度,存储管理,设备管理,文件管理,网络和通信管理,提供用户接口。MCU阶段,SoC阶段。可编程的。 专用性强、可裁剪性号,实时性和可靠性,功耗低、易移植性。裸机开发,实时擦欧总系统Real Time Operation System RTOS, 逻辑或功能正确(Logical or Functional Correctness),时间正确性(Timing Correctness)对计算超时由于一定容忍度:硬实时操作系统、软实时操作系统。分时操作系统。
void mytask(void *pdata){for(;;){/*user code*/}} C语言的任务代码,任务实质尚是一个返回类型为void的函数,并在函数的无限循环中完成用户的工作。该过程中如何响应外部异步事件,使用中断。μC/OS-Ⅱ支持64个任务。微内核。自己设计或外购。μC/OS-Ⅱ是用C语言和汇编语言编写的,其中绝大部分用C语言编写的,极少部分与处理器密切相关的额代码用汇编语言编写,用户 只要做很少的工作就可以把它移植到各类8位、16位和32位嵌入式处理器上。体系架构:
与小任务对应的程序实体叫做任务,实质是一个线程,小任务运行管理和调度。任务程序代码(用来保存任务属性)、任务堆栈(用来保存任务工作环境)和任务控制块(用来保存任务属性)。两种任务:用户任务和系统任务。任务在内存中的结构:任务的组成、任务链表:
任务状态,一个具体时刻只能允许一个任务占用CPU,任务5种状态,不同状态之间转换:
用户任务代码的一般结构,根据嵌入式系统任务的工作特点,任务的执行代码通常是一个无线循环结构,并且在这个循坏中可以响应中断,这种结构也叫做超循环结构。、
void MyTask(void * pdata){for(;;){可以被中断的用户代码; OS_ENTER_CRITICAL()关中断; 不可以被中断的用户代码; OS_EXIT_CRITIAL()开中断; 可以被中断的用户代码;}}
用户应用程序的结构:void MyTask1(void * pdata){for(;;){...}} void MyTask2(void * pdata){for(;;){...}} void MyTask3(void * pdata){for(;;){...}}void main(){ OSInit();OSTaskCreate(MyTask1,..); OSTaskCreate(MyTask2,..); OSTaskCreate(MyTask3,..);OSStart(); ...} OSTaskCreat()为操作系统提供的用来创建任务的函数,OSStart()为操作系统提供的启动各任务的函数,使用函数OSStart()启动了各任务之后,任务就交给操作系统来管理和调度
系统任务:预定义两个为应用程序服务的系统任务:空闲任务和统计任务。空闲任务:无用户任务可运行而处于所谓的空闲状态,没有用户任务可执行CPU有事可做,提供了一个叫做空闲任务OSTaskIdle()的系统任务,代码void OSTaskIdle(void * pdata){# if OS_CRITICAL_METHOD==3 OS_CPU_SR cpu_sr; #ednif pdata=pdata;for(;;){OS_ENTER_CRITICAL()关闭中断;OSdleCtr++计数;OS_EXIT_CRITICAL()开放中断;}}统计任务OSTaskStat(),这个统计任务每秒计算一次CPU在单位事件内被使用的时间,并把计算结果以百分比的形式存放在变量OSCPUUsage,以便应用程序胡通过访问它来了解CPU的利用率,所以系统任务OSTaskStat()叫做统计任务。如果用户应用程序要使用这个统计任务,需要把定义在系统头文件OS_CFG.H中的系统配置常数)S_TASK_STST_EN设置为1,并在创建统计任务之前调用函数OSStatInit()对统计任务进行初始化
任务的优先权及优先级别 0最高 为节省内存,OS_CFG.H中最低优先级别常数OS_LOWEST_PRIO0,1,2,。。。,OS_LOWEST_PRIO
堆栈就是在存储器中按后进先出LIFO原则组织的连续存储空间,每个任务都应该有自己的堆栈。在文件OS_CPU.H中专门定义了一个数据类型OS_STK,typedef unsigned int OS_STK; 在应用程序中定义任务堆栈即定义一个OS_STK类型的数组 #define TASK_STK_SIZE 512 OS_STK TaskStk;当调用函数OSTaskCreate()来创建一个任务时,把数组的指针传递给函数OSTaskCreate()中的堆栈栈顶参数ptos,就可以把该数组与任务关联起来而成为该任务的任务堆栈。创建任务函数OST ask Create()的原型:INT8U OSTaskCreate(void (*task)(void *pd), void =pdata, OS_STK *PTOS, INT8U prio);
处理器,堆栈增长方向,向上、向下,提高应用程序的可以执行,在编写程序时把两种代码都编写出来,利用OS_CFG.H文件中的常数OS_STK_GROWTH作为选择开关,用户定义它,以适应不同的堆栈增长方式需要。
任务堆栈的初始化:当CPU启动运行一个任务,CPU各寄存器总是需要预置一些初始数据人(如指向任务的指针、程序状态字PSW等),系统启动任务,CPU从任务堆栈里获得这些数据,从堆栈中赋值到CPU各寄存器使任务顺利启动运行,任务堆栈的初始化工作由操作系统负责。创建任务函数OSTaskCreate()中调用初始化函数OSTaskStkInit()来完成 OS_STK * OSTaskStkInit()此函数是μC移植时按处理器由用户编写内容,
任务控制块一个结构类型数据,当用户你应用程序调用OSTask Create()函数创建一个用户任务时,这个函数会对任务控制块中多有成员赋予与带任务相关的数据,并驻留在RAM中,任务控制块结构体的定义再记下。用两条链表来管理任务控制块,系统在调用行数OSInit()初始化系统时在RAM中建立一个OS_TCB结构类型的数组OSTCBTB[],每个数组元素就是一个任务控制块,连接成链表,空链表。操作系统负责任务控制块初始化,用户程序掉用创建任务,函数调用系统函数OSTCBInit()进行任务控制块初始化
任务调度:通过一个算法在多个任务中确定哪个任务来运行,任务调度器,思想:每时每刻让优先级最高的就绪任务处于运行状态。任务就绪表。优先级高低顺序,每个任务一个位,1就绪,0非就绪。任务被中止运行时的位置叫做断点从,任务恢复运行时,在断点处以断点数据(PC PSW 通用寄存器中的数据)作为初始数据接着运行。一般情况中断服务程序要用汇编语言来写寄存器操作。
大亮
发表于 2024-5-31 20:05:12
【何教授 CAN总线原理及实战】12月18日上 学习笔记
博世 协议文本 --》Intel CAN控制器芯片 Philips CAN控制器芯片 --》奔驰
CAN2.0B规范。 分层模型。
CAN FD 1.0(可变数据速率CAN),兼容CAN。
物理层协议:CAN控制器输出驱动器逻辑,CAN收发器(PHY驱动芯片)输出差分信号。逻辑0 --》显性信号。
(管子工艺)PNP晶体管 --》 CANH NPN晶体管--》CANL 晶体管没有导通--》隐形电压
规约
大亮
发表于 2024-6-4 19:35:44
《CAN总线原理和实战》12月19日中、下
协议,规范,知识的集成,拒收/过滤机制, CAN控制器 MCU的外设模块,发送条件:发送缓冲器有数据,&& 网络条件具备, 消息帧, 高可靠性通讯,校验,多种校验方式。
直流部分,磁化线缆;位填充,破坏直流,提供足够多的上升沿
规范,分层结构,不同硬件和软件解决不同问题。
多播
位速率,串口的要求。 静态消息优先级。
远程帧,远程数据请求。
机制。
香浓定理。
dominant显性 逻辑0 ;Recessive隐形 逻辑1;
CAN2.0B 数据链路层:LLC MAC
数据帧,远程帧,错误帧,过载帧(吞吐量概念,平衡网路数据传输量)。
帧起始 冲裁字段 控制字段 数据字段 CRC字段 ACK字段 帧结束
SOF(1位) 标识符(11位) RTR IDE r0 DLC 数据字段
SOF(1位)标识符(11位)SRR IDE标识符18位 RTR r0 r1 DLC
站。站点。
ID10 到 ID0 的顺序发送 ID0 LSB
最高的7位 (ID10 ~IDE4)不能都是隐形位
从高往低发送。
保留位必须显性发送。
DLC:数据长度的编码
生成多项式,表示异或运算,使用15位的移位寄存器CRC_RC(14:0),CAN控制器电路实现,异或电路。CRC定界符。
应答。
屏蔽寄存器
大亮
发表于 2024-6-7 22:00:56
【CAN总线原理及实战】12月20日 上
位错误,晶体管,Tx 同时 Rx,协议设计巧妙之处;
位填充错误,每5个相同逻辑位,填充;
CRC错误,校验错误;
格式错误,非法位;
保证可靠传输。
响应错误,ACK应答槽;
错误指示,错误管理,一个站:错误主动,错误被动,总线关闭。
评判的过程,规则。CAN控制器 两种计数器,发送错误计数器,接收错误控制器,接受计数器+1,+8,CAN控制器的错误管理单元。
容错,-1,
位时序要求,同步,采样点,串口,标称位时间 = 1 / 标称位速率。采样点,读取总线电平并解释为相应位的值的时间点。
速率高,传输介质要求
时间份 TQ
位时间可编程是必要的
隐形到显性的边沿,硬同步;
模块内部结构框架
STC32G系列单片机集成了两路CAN接口控制器 第一路引脚的位置通过P_SW1寄存器 地址A2H 通过多路选择器决定引脚
第二路引脚位置通过P_SW3寄存器设置 地址BBH
外设
背靠大树好乘凉
发表于 2024-7-31 20:05:52
小白虽然还看不懂很多,但能学习很多还是挺激动的
大亮
发表于 2024-8-4 11:47:25
《CAN总线原理及实战》 - 12月20日下
CAN总线接收寄存器 和 CAN总线接收屏蔽寄存器
通过逻辑运算 当接收屏蔽位为“1”时,即无关,均接收
当接收屏蔽位为“0”时,即相关,然后比较ACR
轻量级协议,设计巧妙之处。
总线错误信息寄存器 ECC
B7 当RXERR 接收错误寄存器 大于等于96时该位置位
B6 当TXERR- 发送错误寄存器 大于等于96时该位置位
B5 该位为0时,发送时发生错误,该位为1时,接收时发生错误
B4 ACK错误
B3 FRMER 帧格式错误
B2 CRC错误
B1 位填充错误
B0 位错误
ALC 总线仲裁丢失寄存器仲裁丢失的位置的信息
参考电路 原理图
TJA 1050 CAN收发器 (1042/3)
CAN总线数据帧发送缓存 TXBUFn!!!
【重要】初始化要发送数据并给出一个CANID号 要发送数据怎么写入发送缓冲区的 调用一个CanSendMsg(CAN_ID, TX_BUF)函数
读、写寄存器 CPU处理 CAN地址寄存器CAN数据寄存器 数据怎么发送出去的 数据帧发送缓存 TX_BUFn
Buffer放到数组里面
根据需要,调用读FIFO函数,把需要数据放进一个数组。
潘豆豆
发表于 2024-10-3 16:41:46
画的什么东西
江上酒酒
发表于 2024-10-5 11:42:18
大亮 发表于 2023-9-5 11:29
陈教授《STC最新8051单片机原理及应用--STC8H8K64U》(7月26日) -- 学习笔记
数字电路、数字逻辑:高/低电 ...
加油