WCH沁恒单片机
直播中

juju宇哥

9年用户 1474经验值
擅长:479809
私信 关注
[问答]

CH376S以字节方式写入数据失败怎么处理?

主控芯片:PICF18
通讯方式:8位并口
中断方式:状态最高位检测
        USB初始化正常,建立的txt文件可以正常打开,但是无写入数据。



程序如下所示:
;==================================================
;=CH376_Byte_Writ 字节 写 子程序=
;==
;=入口参数:ReqCount_L:ReqCount_H (数据长度)=
;=出口参数:无=
;=标志:=
;==
;=振荡器:64.000MHz ( 0.0625uS/步 ) 因数据变化,耗时约:xxxxuS~xxxuS=
;==
; 节点 ======== 命令 ========== 系数 ========== 注解
CH376_Byte_Writ
BTFSCFILE_376,Byte_test           ; FILE_376,Byte_test=? 1
GOTOWrite_Req_Block; 转到 Write_Req_Block


; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


BTFSCSybl,CMD_WR_Complt; Sybl,CMD_WR_Complt =? 1
GOTOByte_Writ_check; 转到 Byte_Writ_check


MOVLWCMD2H_BYTE_WRITE; H'3C'
CALLWrite_CH376_Cmd; 调用 写命令子程序


MOVLWReqCount_L; 写数据块长度
CALLWrite_CH376_DATA; 调用 写数据子程序


MOVLWReqCount_H; 写数据块长度
CALLWrite_CH376_DATA; 调用 写数据子程序


BSFSybl,CMD_WR_Complt; 置:Sybl,CMD_WR_Complt = 1


; - - - - - - - - - - - - - - - 检查:中断标志 - - - - - - - - - - - - - - - - - - - - - -
Byte_Writ_check
CALLRead_CH376_Statu; 调用 读状态 子程序
MOVFFCH376_BUFER,Intrput_Statu;


; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


BTFSCIntrput_Statu,7; 最高位 =? 0
RETURN; 无中断,返回到原来调用处


; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


MOVLWUSB_INT_DISK_WRITE; H'1E'
MOVWFCMD_Succe_da;


CALLInterupt_SW; 调用 软件中断 子程序


; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


BTFSSSybl,Intrput_Succe; =? 1
GOTOByte_Writ_fail; 转到 Byte_Writ_fail


; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


CALLCH376_Writ_Req; 调用 写数据请求 子程序


; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


BSFFILE_376,Byte_test; 置:写 数据块 完成 标志


RETURN; 写数据已完成,返回原调用处


; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Byte_Writ_fail


BCFFILE_376,Byte_test; 置:写 数据块 完成 标志


RETURN; 写数据已完成,返回原调用处


; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Write_Req_Block
MOVLWCMD0H_BYTE_WR_GO; H'3D'
MOVWFCMD_Intrput;


CALLInterupt_Check; 调用 中断检查 子程序


; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


BTFSCIntrput_Statu,7; 最高位 =? 0
RETURN; 无中断,继续等待


; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


MOVLWUSB_INT_DISK_WRITE; H'1E'
MOVWFCMD_Succe_da;


CALLInterupt_SW; 调用 软件中断 子程序


; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


BTFSSSybl,Intrput_Succe; =? 1
GOTOWrite_Req_Block1; 转到 Write_Req_Block1 继续写数据块


; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


CALLCH376_Writ_Req; 调用 写数据请求 子程序


; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


BCFFILE_376,Byte_Write; 置:写 数据块 完成 标志


RETURN; 写数据已完成,返回原调用处


; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Write_Req_Block1


BSFFILE_376,Byte_Write; 置:写 数据块 完成 标志
BCFSybl,CMD_WR_Complt; 清:= 0 中断命令发送标志


RETURN; 写数据已完成,返回原调用处




;=================================================
;=CH376_Writ_Req 字节 写请求 子程序=
;==
;=入口参数:无=
;=出口参数:ReqLCount(返回数据长度)=
;=标志:=
;==
;=振荡器:64.000MHz ( 0.0625uS/步 ) 因数据变化,耗时约:xxxxuS~xxxuS=
;==
; 节点 ======== 命令 ========== 系数 ========== 注解
CH376_Writ_Req
MOVLWCMD01_WR_REQ_DATA; H'2D'
CALLWrite_CH376_Cmd; 调用 写命令 子程序


CALLRead_CH376_DATA; 调用 读状态子程序
MOVFFCH376_BUFER,ReqLCount; 返回数据块请求长度


; - - - - - - - - - - - - - - - - - 写:数据块 - - - - - - - - - - - - - - - - - - - - -


MOVFFReqLCount,LEDCONT;


; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CH376_Writ_Req1
MOVLWH'AB';  
CALLWrite_CH376_DATA; 调用 写数据子程序


MOVLWD'5'; 延时200MS
CALLDELAY_Xms; 调用 MS延时 子程序


DECFSZLEDCONT,F; =?0
GOTOCH376_Writ_Req1; 继续写数据块


; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


RETURN; 写数据已完成,返回原调用处


  请哪位大神帮忙看一下问题在哪里?

回帖(9)

宫昊

2022-7-13 10:04:25
您好,CH376字节写入无法操作可以检查一下以下两点


  • 文件操作完后是否有关闭文件操作,发送命令CMD1H_FILE_CLOSE(0x36),和数据1(更新文件大小)。
  • 文件名创建是否符合“短文件”要求,文件名由不超过8字符的大写英文字母或数字组成,后缀由不超过3字符的大写英文字母或数字组成。
举报

李琴

2022-7-13 10:04:29
1、文件名:年月日.TXT    例如:20210120.TXT
2、文件关闭操作成功:发送CMD1H_FILE_CLOSE(36H)+ 数字(1),检测到中断,中断状态为USB_INT_SUCCESS(14H)。
  数据写入仍然失败,且文件有一个 字节 乱码。
举报

吕声城

2022-7-13 10:04:33
你好:
如果所有操作返回值都是成功,但是查看文件是1个字节,应该是写延迟现象,有2种方法解决。

  • 方法1,写完文件后,通过修改文件属性中的文件长度命令,强制修改文件长度为当前写入文件大小。注意是修改文件属性的命令(CH376DirInfoSave()函数,参考EXAM10)。

  • 方法2,写完文件后,执行59H命令,进行磁盘刷新。此命令只对U盘有用,对SD卡无效。
举报

廖靖华

2022-7-13 10:04:45
采用方法2:先发送命令CMD0H_DISK_READY(59H),等待判断,检查中断状态寄存器数值为14H
写入数据:20 20 20 20 20
文件在PC端打开显示数据为:EA AE
测试其他写入数据,并不影响文本中的内容。
数据仍没有写入U盘中。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分