网络层包括文件15765.c。
15765.c包括遵循15765-2协议的接口,实现诊断请求消息解析,诊断响应消息的封装及发送。
本文档仅简述与UDS应用层接口的几个函数,具体设计细节参考#网络层设计。
初始化nt_init()
函数原型 |
nt_status_t nt_init (void) |
函数作用 |
初始化应用层诊断命令接收缓冲区。 |
函数参数 |
无 |
函数说明 |
系统复位后,使用网络层进行数据传输前调用(仅一次)。 |
表26 函数nt_init ()说明
CAN消息接收接口nt_received_frame()
函数原型 |
BOOL nt_received_frame(Uint16 frame_length, const Uint16 *frame_data) |
函数作用 |
接收并分析诊断命令消息。当接收到有效而完整的诊断消息后,通知应用层处理。 |
函数参数 |
frame_length:收到的CAN消息长度。 *frame_data::CAN消息数据存储的地址指针。 |
函数说明 |
当nt_pre_process()接收到有效而完整的诊断消息时调用。 |
表27 函数nt_received_frame ()说明
CAN消息发送接口nt_tx_msg()
函数原型 |
nt_status_t nt_transmit (Uint16 length) |
函数作用 |
判断当前网络层状态是否允许发送数据。若允许,设置相应的标志位及网络层状态(网络层状态指发送FF,发送SF,等待CF等)。 |
函数参数 |
length:UDS应用层要发送的数据长度。 |
函数说明 |
网路层缓冲区装完有效数据后。 |
表28 函数nt_tx_msg ()说明
网络层任务接口nt_post_process()
函数原型 |
void nt_post_process (void) |
函数作用 |
根据网络层的状态进行相应的操作;如:网络层要发送单帧或多帧,则nt_pre_process()将UDS数据拷贝到nt_buffer[],并设置相应的标志位。 |
函数参数 |
length:UDS应用层要发送的数据长度。 |
函数说明 |
被nt_pre_process() 调用。 |
表29 函数nt_post_process()说明
网络层与boot-loader接口
包括文件hal_nt_interface.c。此文件中主要包括因boot-loader和应用程序CAN驱动中不同而导致与网络层与CAN驱动接口不同的部分。
Hal_nt_interface.c实现从CAN模块邮箱中接收CAN消息并通知网络层处理,及将网络层要发送的CAN消息发送出去。
网络层初始化nt_interface_init()
函数原型 |
void nt_interface_init(void) |
函数作用 |
显式的将网络层全局变量初始化。如:uds_rx_dlc,uds_rx_data[],uds_tx_data[]。 |
函数参数 |
无 |
函数说明 |
和nt_post_process()一样,被uds_prog_main(调用)。 |
表30 函数nt_interface_init ()说明
网络层接口主函数nt_pre_process()
函数原型 |
void nt_pre_process (void) |
函数作用 |
从CAN模块邮箱接收CAN消息(存储到uds_rx_data[8]中)并解析(调用nt_received_frame())。当接收到有效的诊断消息时(有效指CAN ID正确并符合15765-2规范),nt_received_frame()将剥离出诊断消息数据存储在缓冲区(nt_buffer[256+1](TBD))中,并调用诊断应用层诊断命令处理接口(uds_request_handler())处理。 |
函数参数 |
无 |
函数说明 |
和nt_pre_process()一样,被uds_prog_main(调用)。 |
表31 函数nt_pre_process ()说明
网络层CAN消息发送nt_can_msg_send()
函数原型 |
void nt_can_msg_send(void) |
函数作用 |
将网络层发送缓冲区uds_tx_data[8]中的数据发送出去。 |
函数参数 |
无 |
函数说明 |
被nt_pre_process_send()调用,nt_pre_process_send()被nt_pre_process()调用。 |
表32 函数nt_can_msg_send ()说明
诊断应用层设计
如前所述,为了在boot-loader和应用程序之间尽可能的复用函数,boot-loader诊断应用层分为以下几个部分:
uds_refresh_main.c:包括了刷新模式下支持的UDS诊断服务函数
uds_status.c:包括一些控制诊断模式及状态相关函数
uds_utlis.c: 其他功能函数
诊断请求服务函数
文件uds_refresh_main.c。
UDS诊断请求处理接口uds_cmd_process()
函数原型 |
void uds_cmd_process(Uint16 length) |
函数作用 |
处理网络层解析后的UDS请求,根据安全状态及诊断模式在uds_cmd[]中查找相应得诊断请求服务。 |
函数参数 |
length:网络层解析后的UDS诊断请求数据长度 |
函数说明 |
被nt_received_frame()调用。参考4.8.2及4.9.2节 |
表33 函数uds_cmd_process()说明
诊断模式控制uds_service_10_process()
函数原型 |
void uds_service_10_process(void) |
函数作用 |
DiagnosticSessionControl请求服务程序,处理诊断模式切换请求 |
函数参数 |
无 |
函数说明 |
被uds_cmd_process()调用。 |
表34 函数uds_service_10_process ()说明
ECU复位uds_service_11_process ()
函数原型 |
void uds_service_11_process (void) |
函数作用 |
ECUReset请求服务程序,处理ECU复位请求 |
函数参数 |
无 |
函数说明 |
被uds_cmd_process()调用。 |
表35 函数uds_service_11_process ()说明
安全验证uds_service_27_process ()
函数原型 |
void uds_service_27_process (void) |
函数作用 |
SecurityAccess请求服务程序,处理安全验证请求,设置诊断安全状态 |
函数参数 |
无 |
函数说明 |
被uds_cmd_process()调用。 |
表36 函数uds_service_27_process ()说明
远程控制uds_service_31_process ()
函数原型 |
void uds_service_31_process (void) |
函数作用 |
RoutineControl请求服务程序,处理远程控制请求。 将根据诊断请求的程序标识符(RountineID)在LocalRoutines[]中查找相关的程序并执行。 |
函数参数 |
无 |
函数说明 |
被uds_cmd_process()调用。 |
表37 函数uds_service_31_process ()说明
请求下载uds_service_34_process ()
函数原型 |
void uds_service_34_process (void) |
函数作用 |
RequestDownload请求服务程序,处理下载请求。 将根据诊断请求中的传输开始地址MTA0及内存块大小MemorySize判断该请求是否合法。 |
函数参数 |
无 |
函数说明 |
被uds_cmd_process()调用。 |
表38 函数uds_service_34_process ()说明
数据传输uds_service_36_process ()
函数原型 |
void uds_ service_36_process (void) |
函数作用 |
TransferData请求服务程序,数据传输。 该命令在MCU及外部工具之间进行数据传输。 如果是Download模式,则从外部工具向MCU传数据。 如果是Upload模式,则从MCU向外部工具传数据。 |
函数参数 |
无 |
函数说明 |
被uds_cmd_process()调用。 |
表39 函数uds_service_36_process ()说明
请求传输退出uds_ service_37_process ()
函数原型 |
void uds_ service_37_process (void) |
函数作用 |
RequestTransferExit请求服务程序,请求退出数据传输。 |
函数参数 |
无 |
函数说明 |
被uds_cmd_process()调用。 |
表40 函数uds_service_37_process ()说明
请求传输退出uds_ service_3E_process ()
函数原型 |
void uds_ service_3E_process (void) |
函数作用 |
TesterPresent请求服务程序 |
函数参数 |
无 |
函数说明 |
被uds_cmd_process()调用。 |
表41 函数uds_service_3E_process ()说明
诊断状态控制
文件uds_status.c。
诊断安全状态机
函数原型 |
void uds_secure_sm(void) |
函数作用 |
根据外部诊断工具连接情况切换诊断安全状态。 |
函数参数 |
无 |
表42 函数uds_secure_sm ()说明
诊断模式状态机
函数原型 |
void uds_session_sm (void) |
函数作用 |
根据外部诊断工具连接情况切换诊断模式。 |
函数参数 |
无 |
函数说明 |
被uds_refresh_status ()调用。 |
表43 函数uds_session_sm ()说明
诊断状态刷新
函数原型 |
void uds_refresh_status (void) |
函数作用 |
刷新安全状态及模式 |
函数参数 |
无 |
函数说明 |
被uds_prog_main()调用。 |
表44 函数uds_refresh_status ()说明
进入刷新模式安全检查uds_can_enter_bootblock ()
函数原型 |
BOOL uds_can_enter_bblk(void) |
函数作用 |
根据系统当前安全情况判断是否可以进入刷新模式 |
函数参数 |
无 |
函数说明 |
被应用程序main()调用,在收到诊断模式请求进入刷新模式之后调用。 |
表45 函数uds_can_enter_bblk ()说明
其他功能函数库
文件uds_utlis.c。
函数原型 |
void uds_transmit_response_msg (const Uint16 * uds_data, Uint16 uds_data_length)) |
函数作用 |
UDS应用层发送数据接口 |
函数参数 |
uds_data:指向UDS应用层要发送的数据的缓冲区。 uds_data_length:UDS应用层要发送的数据长度。 |
函数说明 |
被各诊断服务请求处理函数调用。 |
表46 函数uds_tx_msg ()说明
UDS应用层接收数据uds_read_request_msg()
函数原型 |
Uint16 uds_read_request_msg (Uint16 default_data) |
函数作用 |
UDS应用层接收数据接口 |
函数参数 |
default_data:缺省返回数据 |
函数说明 |
用于UDS应用层在网络层解析后的诊断请求数据缓冲区抽取数据。调用一次抽取一个字节,当uds_rx_index>=uds_rx_length时,返回缺省数据。 |
表47 函数uds_rx _msg()说明
UDS负响应uds_negative_response()
函数原型 |
void uds_negative_response (Uint16 Service, Uint16 ResponseCode) |
函数作用 |
UDS应用层接收数据接口 |
函数参数 |
Service:负响应服务ID。 ResponseCode: 错误码。 |
函数说明 |
由于UDS负响应消息格式一样,所以用这个接口来统一发送负响应。 |
表48 函数uds_negative_response ()说明
UDS无响应消息uds_no_response()
函数原型 |
void uds_no_response(void) |
函数作用 |
UDS无响应消息时的动作:设置网络层状态。 |
函数参数 |
无 |
函数说明 |
UDS无响应消息: 清除网络层缓冲区被应用层锁定标志 设置网络层缓冲区被网络层锁定标志 |
表49 函数uds_no_response ()说明
TI DSP28xx的FLASH擦除按扇区擦除。
扇区擦除大约会耗时5秒,所以在进行FLASH擦除的时候定时器中断服务应完成看门狗服务。擦除函数将返回擦除结果。
由于刷新代码在RAM中运行,boot-loader可以刷新自己所在的FLASH扇区。
本函数用宏实现调用TI FLASH驱动库。
编程flash_program()
TI DSP28xx的FLASH编程按字(两个字节)编程:要编程的FLASH地址及数据指针传递给FLASH API的编程函数。
编程速度大约是1000字/100毫秒,所以在进行FLASH编程的时候定时器中断服务应完成看门狗服务。
由于编程地址自增长,待编程的数据必须是连续的块。
本函数用宏实现调用TI FLASH驱动库。
Toggle测试flash_toggle_test()
本函数测试FLASH模块的时钟(PLL及FLASH模块时钟)是否正常配置:当执行此函数时,用户指定的I/O口上应输出方波,如果该方波频率不是10KHz(TBD),则FLASH不能进行编程(可能毁坏FLASH)。
本函数将调用TI FLASH驱动库函数:
void Flash28XX_ToggleTest(volatile Uint32 *ToggleReg, Uint32 Mask // Pin Mask)
本函数运行时不返回。
在调用此函数时,禁止DSP中断,故将导致DSP硬件狗复位,时间(TBD)。
本函数可通过UDS诊断命令RoutineControl($31)请求执行。
本函数通过调用TI FLASH驱动库Flash28XX_ToggleTest(a,b)实现。
仅开发阶段用此函数来测试FLASH模块时钟配置。
函数原型 |
void flash_toggle_test(void) |
函数作用 |
FLASH Toggle Test |
函数参数 |
无 |
函数说明 |
Flash28XX_ToggleTest()的参数在本函数里设置(TBD) |
表50 函数bblk_flash_toggle_test()说明
恢复flash_depletion_recovery()
如果在进行FLASH操作时出现电压低或掉电等情况,可能出现FLASH损坏的情况。
TI FLASH驱动库函数Flash2808_DepRecover ()支持恢复FLASH(时间不确定,结果也不确定)。
本函数通过调用TI FLASH驱动库函数Flash28XX_DepRecover ()实现。
本函数可通过UDS诊断命令RoutineControl($31)请求执行。
函数原型 |
bool flash_depletion_recovery(void) |
函数作用 |
FLASH Toggle Test |
函数参数 |
无 |
函数说明 |
表 51 函数flash_depletion_recovery()说明
获取FLASH驱动版本obtain_flash_api_version()
本函数返回当前使用的TI FLASH API库的版本号。
本函数通过调用TI FLASH驱动库函数Flash2808_APIVersion()实现。
本函数可通过UDS诊断命令RoutineControl($31)请求执行。
函数原型 |
Uint16 flash_obtain_flash_api_version (void) |
函数作用 |
FLASH Toggle Test |
函数参数 |
无 |
函数说明 |