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; 写数据已完成,返回原调用处


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


您好,CH376字节写入无法操作可以检查一下以下两点

  1. 文件操作完后是否有关闭文件操作,发送命令CMD1H_FILE_CLOSE(0x36),和数据1(更新文件大小)。

  2. 文件名创建是否符合“短文件”要求,文件名由不超过8字符的大写英文字母或数字组成,后缀由不超过3字符的大写英文字母或数字组成。


1、文件名:年月日.TXT    例如:20210120.TXT

2、文件关闭操作成功:发送CMD1H_FILE_CLOSE(36H)+ 数字(1),检测到中断,中断状态为USB_INT_SUCCESS(14H)。

  数据写入仍然失败,且文件有一个 字节 乱码。



你好:

如果所有操作返回值都是成功,但是查看文件是1个字节,应该是写延迟现象,有2种方法解决。

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

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


采用方法2:先发送命令CMD0H_DISK_READY(59H),等待判断,检查中断状态寄存器数值为14H

写入数据:20 20 20 20 20

文件在PC端打开显示数据为:EA AE

测试其他写入数据,并不影响文本中的内容。

数据仍没有写入U盘中。


疑问:数据写入U盘,使用CH376ByteWrite( buf, s, NULL ),并且在关闭文件时,写入数据1,即可将数据写到U盘中?是否还需要其他操作?


1、 U盘的文件  20210121.TXT  直接建立在U盘中,没有使用多级目录,因此,这是否属于根目录文件?

2、现在有一个问题是,我按照 附件中图片 中打开文件操作步骤编写程序,只有在屏蔽 第4步骤 时,才可以正确写入数据,不使用此步骤是否有问题?

3、按照字节方式写入数据:写入的是否是数据对应的ASSIC码 ? 

例如:想要写入的数据为 :Temp=60℃

            实际写入数据:54 65 6D 70 3D 36 30 A1 E6

icon_jpg.gif捕获.PNG




1、是的

2、该份文档应用于老版本芯片,目前的CH376芯片均为最新版,已经不需要步骤4,最新芯片实际操作方式建议参考手册+实例代码。示例代码中针对芯片版本有预编译,选择是否要执行步骤4

3、是的,最好在后面再加上回车换行


因为我需要生成的是EXCEL文件,我应该怎么将不同的数据放在不同的表格中。

例如:图片附件所示

icon_jpg.gif捕获.PNG



问题1 :初始写入数据会有一个字节乱码存在,如何使其清除?

问题2:连续写入数据时,每隔 1F 区域 会出现 1个字节乱码,如附件图片1,2所示,此问题如何解决?

icon_jpg.gif捕获2.PNG

icon_jpg.gif捕获1.PNG



请问CH376可以将不同的数据放在不同的表格中?


您好,这个是可以做的。不过CH376每次只能对一个文件操作,您需要自己在程序里面做好数据的处理,然后再调用OPEN函数,把数据放入对应的文件中。


只有登录才能回复,可以选择微信账号登录