读写sd卡的方法及装置的制造方法

文档序号:10656187阅读:219来源:国知局
读写sd卡的方法及装置的制造方法
【专利摘要】本发明公开了一种读写SD卡的方法,所述读写SD卡的方法包括以下步骤:通过模拟的SPI接口对所述SD卡进行初始化,其中,所述SPI接口采用基带芯片的GPIO接口模拟;在所述SD卡完成初始化后,对所述SD卡进行读/写操作。本发明还公开了一种读写SD卡的装置。本发明解决了采用了另加一个芯片的方案来实现SD卡的读写时,明显增加了硬件成本的问题。
【专利说明】
读写SD卡的方法及装置
技术领域
[0001]本发明涉及SD卡读写技术领域,尤其涉及一种读写SD卡的方法及装置。【背景技术】
[0002]随着移动通讯技术的发展,手机的发展也日新月异,为降低企业成本以及提高竞争力,企业往往会开发成本较为低廉的系统,但成本较为低廉的系统则可能会导致一些功能无法实现,如现有的大部分低成本系统没有SPI接口只有GP10接口,而GP10接口无法实现与SD卡之间的通信,导致无法实现对SD卡的操作,例如MTK6223D系统。
[0003]为解决上述SD卡的读写操作的问题,通常采用了另外增加一个芯片的方案来实现 SD卡的读写,但该种方案明显增加了硬件成本,导致成本较高。
【发明内容】

[0004]本发明的主要目的在于提供一种读写SD卡的方法及装置,旨在解决采用了另加一个芯片的方案来实现SD卡的读写时,明显增加了硬件成本的问题。
[0005]为实现上述目的,本发明提供的一种读写SD卡的方法,所述读写SD卡的方法包括以下步骤:
[0006]通过模拟的SPI接口对所述SD卡进行初始化,其中,所述SPI接口采用基带芯片的 GP10接口模拟;
[0007]在所述SD卡完成初始化后,对所述SD卡进行读/写操作。
[0008]可选地,所述对所述SD卡进行写操作的步骤包括:
[0009]通过所述SPI接口发送写操作命令至所述SD卡;
[0010]在所述SPI接口接收到所述SD卡基于所述写操作命令反馈的响应数据,且所述响应数据为预设值时,将待写入数据中的待写入数据块经SPI接口写入所述SD卡中;
[0011]在将所述待写入数据块写入所述SD卡后,将所述待写入数据中当前写入的数据块的下一数据块作为待写入数据块;
[0012]继续执行所述通过所述SPI接口发送写操作命令至所述SD卡的步骤,直至将所述待写入数据的所有数据块写入所述SD卡中。
[0013]可选地,所述将待写入数据中的待写入数据块经SPI接口写入所述SD卡中的步骤之后,还包括:
[0014]接收所述SD卡的响应应答命令;
[0015]在所述响应应答命令正确时,执行所述将所述待写入数据中当前写入的数据块的下一数据块作为待写入数据块的步骤;
[0016]在所述响应应答命令不正确时,将所述待写入数据中当前写入的数据块继续作为待写入数据块,并继续执行所述通过所述SPI接口发送写操作命令至所述SD卡的步骤。
[0017]可选地,所述对所述SD卡进行读操作的步骤包括:[〇〇18]通过所述SPI接口发送读操作命令至所述SD卡;
[0019]在所述SPI接口接收到所述SD卡基于所述读操作命令反馈的响应数据,且所述响应数据为预设值时,经所述SPI接口从所述SD卡中读取待读取数据的待读取数据块;
[0020]在读取到所述待读取数据块后,将所述待读取数据中当前读取的数据块的下一数据块作为待读取数据块;
[0021]继续执行所述通过所述SPI接口发送读操作命令至所述SD卡的步骤,直至读取完所述待读取数据的所有数据块。
[0022]可选地,所述将所述待读取数据中当前读取的数据块的下一数据块作为待读取数据的步骤之前,还包括:
[0023]在读取到所述待读取数据块后,判断所述待读取数据块中的校验码是否正确;
[0024]若所述校验码正确,则执行所述将所述待读取数据中当前读取的数据块的下一数据块作为待读取数据块的步骤;[〇〇25]所述判断所述待读取数据块中的校验码是否正确的步骤之后,所述读写SD卡的方法还包括步骤:
[0026]若所述校验码不正确,将所述待读取数据中当前读取的数据块继续作为待读取数据块,并继续执行所述通过所述SPI接口发送写操作命令至所述SD卡的步骤。[〇〇27]此外,为实现上述目的,本发明还提供一种读写SD卡的装置,所述读写SD卡的装置包括:[〇〇28]初始化模块,用于通过模拟的SPI接口对所述SD卡进行初始化,其中,所述SPI接口采用基带芯片的GP10接口模拟;[〇〇29]读写模块,用于在所述SD卡完成初始化后,对所述SD卡进行读/写操作。[〇〇3〇]可选地,所述读写模块包括:[〇〇31]发送单元,用于通过所述SPI接口发送写操作命令至所述SD卡;[〇〇32]写入单元,用于在所述SPI接口接收到所述SD卡基于所述写操作命令反馈的响应数据,且所述响应数据为预设值时,将待写入数据中的待写入数据块经SPI接口写入所述SD 卡中;[〇〇33]作为单元,用于在将所述待写入数据块写入所述SD卡后,将所述待写入数据中当前写入的数据块的下一数据块作为待写入数据块;[〇〇34] 所述发送单元,还用于继续通过所述SPI接口发送写操作命令至所述SD卡,直至将所述待写入数据的所有数据块写入所述SD卡中。[〇〇35] 可选地,所述读写模块还包括:[〇〇36]接收单元,用于接收所述SD卡的响应应答命令;
[0037]所述作为单元,还用于在所述响应应答命令正确时,将所述待写入数据中当前写入的数据块的下一数据块作为待写入数据块;
[0038]所述发送单元,还用于在所述响应应答命令不正确时,将所述待写入数据中当前写入的数据块继续作为待写入数据块,并继续通过所述SPI接口发送写操作命令至所述SD卡。[〇〇39] 可选地,所述读写模块还包括:[〇〇4〇] 所述发送单元,还用于通过所述SPI接口发送读操作命令至所述SD卡;[〇〇41]读取单元,用于在所述SPI接口接收到所述SD卡基于所述读操作命令反馈的响应数据,且所述响应数据为预设值时,经所述SPI接口从所述SD卡中读取待读取数据的待读取数据块;
[0042]所述作为单元,还用于在读取到所述待读取数据块后,将所述待读取数据中当前读取的数据块的下一数据块作为待读取数据块;[〇〇43] 所述发送单元,还用于继续通过所述SPI接口发送读操作命令至所述SD卡,直至读取完所述待读取数据的所有数据块。
[0044]可选地,所述读写模块还包括:
[0045]判断单元,用于在读取到所述待读取数据块后,判断所述待读取数据块中的校验码是否正确;
[0046]所述作为单元,还用于若所述校验码正确,则将所述待读取数据中当前读取的数据块的下一数据块作为待读取数据块;
[0047]所述发送单元,还用于若所述校验码不正确,将所述待读取数据中当前读取的数据块继续作为待读取数据块,并继续通过所述SPI接口发送写操作命令至所述SD卡。[〇〇48]本发明将终端基带芯片的GP10接口模拟为SPI接口,并通过模拟的SPI接口对所述 SD卡进行初始化,在所述SD卡完成初始化后,通过模拟的SPI接口对SD卡进行读写操作,仅需要通过软件程序实现,而不需要增加额外的硬件芯片,降低了硬件成本。【附图说明】
[0049]图1为本发明读写SD卡的方法的第一实施例的流程示意图;
[0050]图2为本发明读写SD卡的方法的第二实施例的流程示意图;[〇〇511图3为本发明读写SD卡的方法的第三实施例的流程示意图;[〇〇52]图4为本发明读写SD卡的方法的第四实施例的流程示意图;[〇〇53]图5为本发明读写SD卡的方法的第五实施例的流程示意图;[〇〇54]图6为本发明读写SD卡的装置的第一实施例的功能模块示意图;[〇〇55]图7为本发明读写SD卡的装置的第二实施例的功能模块示意图;[〇〇56]图8为本发明读写SD卡的装置的第三实施例的功能模块示意图;
[0057]图9为本发明读写SD卡的装置的第四实施例的功能模块示意图;[〇〇58]图10为本发明读写SD卡的装置的第五实施例的功能模块示意图。
[0059]本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。【具体实施方式】
[0060]应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
[0061]上述问题,本发明提供一种读写SD卡的方法。[〇〇62]参照图1,图1为本发明读写SD卡的方法的第一实施例的流程示意图。[〇〇63]在本实施例中,所述读写SD卡的方法包括:[〇〇64]步骤S10,通过模拟的SPI接口对所述SD卡进行初始化,其中,所述SPI接口采用基带芯片的GP10接口模拟;[〇〇65]在本实施例中,由于现有的大部分低成本系统由于仅具有GP10接口,而GP10接口无法实现与SD卡之间的通信,以MTK6223D系统为例。使用MTK6223D系统的终端的基带芯片中不存在SPI接口,使得所述终端不支持SD卡的读写功能,然而可以采用所述基带芯片的 GP1接口模拟所述SPI接口的方式以实现对SD卡的读写功能的支持。比如,通过将SD卡的输出端、输入端、片选端和时钟信号端分别连接至所述基带芯片的GP1接口,然后对照SPI传输模式的时序图使用软件的方式来模拟SPI传输模式的时序。具体的,由于SD的命令、数据传输等,全部都是SPI传输模式的时序图来传输,因此,可以通过控制GP1接口的拉低、拉高来模拟SPI传输模式的时序,从而进行数据的传输,交互。[〇〇66]在通过软件的方式将基带芯片的GP10接口模拟所述SPI接口后,主机,即基带芯片通过模拟的SPI接口对SD卡进行初始化,具体的初始化流程主要包括以下步骤:[〇〇67]步骤1、发送74个时钟周期;[〇〇68] 步骤2、发送复位命令,指令为CMD0;[〇〇69]步骤3、如果SD卡在接收到复位命令时,片选端低电平有效,则进入SPI模式;[〇〇7〇]步骤4、发送激活命令,指令为CMD1;[〇〇71] 步骤5、接收SD卡响应;[〇〇72] 步骤6、判断响应命令的bitO是否为‘0’ ;[〇〇73] 步骤7、若bit0 = 0,则初始化完成。[〇〇74]在SD卡初始化完成后,主机可以通过CMD55指令和CMD41指令判断当前电压是否在工作范围内,还可以通过CMD10指令读取SD寄存器,通过CMD16指令设置读取接收block(块) 的长度,通过CMD9指令读取卡的CSD寄存器,从所述CSD寄存器中,主机(基带芯片)可以获取到卡的容量,支持的命令等重要参数。[〇〇75]步骤S20,在所述SD卡完成初始化后,对所述SD卡进行读/写操作。[〇〇76]在SD卡完成初始化后,主机可以将数据写入SD卡中,或者将数据从SD卡中读取出来,即对所述SD卡进行读/写操作。若要将数据写入SD卡中,则可以通过所述SPI接口发送写操作命令至所述SD卡来实现,所述写操作命令包括单块写操作命令与多块写操作命令,所述单块写操作命令为将单个数据块写入SD中发送的命令,所述多块写操作命令为将多个数据块写入SD卡中发送的命令,即若待写入数据包括多个数据块,则首先发送单块写操作命令,进行数据写入操作,然后发送多块写操作命令,以便将剩余的数据块写入SD卡中。在本实施例中,所述单块写操作命令可以为CMD24,所述多块写操作命令为CMD25。[〇〇77]在SD卡完成初始化后,若要将数据写从SD卡中读取出来,则可以通过所述SPI接口发送读操作命令至所述SD卡来实现,所述读操作命令包括单块读操作命令与多块读操作命令,所述单块读操作命令为将单个数据块从所述SD中读取出来的命令,所述多块读操作命令为将多个数据块从所述SD中读取出来的命令,即若待读取数据包括多个数据块,则首先发送单块读操作命令,进行数据读取操作,然后发送多块读操作命令,以便将剩余的数据块从所述SD中读取出来。在本实施例中,所述单块读操作命令可以为CMD17,所述多块读操作命令为CMD18。[〇〇78]本发明将终端基带芯片的GP10接口模拟为SPI接口,并通过模拟的SPI接口对所述 SD卡进行初始化,在所述SD卡完成初始化后,通过模拟的SPI接口对SD卡进行读写操作,仅需要通过软件程序实现,而不需要增加额外的硬件芯片,降低了硬件成本。[〇〇79]参照图2,图2为本发明读写SD卡的方法的第二实施例的流程示意图。基于上述方法的第一实施例提出本发明的第二实施例,在本实施例中,所述对所述SD卡进行写操作的步骤包括:
[0080]步骤S21,通过所述SPI接口发送写操作命令至所述SD卡;
[0081]步骤S22,在所述SPI接口接收到所述SD卡基于所述写操作命令反馈的响应数据, 且所述响应数据为预设值时,将待写入数据中的待写入数据块经SPI接口写入所述SD卡中; [〇〇82]步骤S23,在将所述待写入数据块写入所述SD卡后,将所述待写入数据中当前写入的数据块的下一数据块作为待写入数据块;[〇〇83]由于SD卡读写都是通过发送CMD命令与通过接收响应应答来实现的,因此,在SD卡完成初始化后,主机若需要对SD卡进行写操作,则需要通过所述SPI接口发送写操作命令至所述SD卡,根据SD卡的传输协议,可以通过所述SPI接口发送单块写操作命令,比如,CMD24 命令,具体的,可以通过如下相关函数实现:
[0084]kal_uint32SD_ffrite_0ne_Bl〇ck(kal_uint32address,kal_uint32*txbuffer)〇
[0085]SD卡在接收到主机发送的写操作命令后,会对所述读操作命令进行响应,响应数据以返回值的形式,该响应数据可以为等,主机在接收到SD卡反馈的响应的数据后,会判断响应的数据是否为预设值,比如,所述预设值为‘〇’,若主机接收到SD卡响应的数据为预设值,则会将待写入数据写入SD卡中。主机在将待写入数据写入SD卡中时,是以数据块为单位进行的,即每次在接收到SD卡基于所述写操作命令反馈的正确的响应数据后,只能将待写入数据中的一个待写入数据块经SPI接口写入所述SD卡中,因此,为了将待写入数据的剩下的数据块写入SD卡中,在将所述待写入数据块写入所述SD卡后,需要将待写入数据中当前写入的数据块的下一数据块作为待写入数据块,然后继续执行步骤S21,即通过所述SPI接口发送写操作命令至所述SD卡,以便将当前写入的数据块的下一数据块写入SD卡中,直至将待写入数据的所有数据块写入所述SD卡中时,才不需要通过所述SPI接口发送写操作命令至所述SD卡。需要说明的是,根据SD卡的传输协议,主机在将待写入数据的下一个数据块写入SD卡中时,通过所述SPI接口发送的写操作命令应为多块写操作命令,比如 CMD25命令,具体的,可以通过如下相关函数实现:
[0086]kal_uint32SD_ffri te_Multi_Blocks(kal_uint32address,kal_uint32* txbuffer,kal_uint8blocks)〇[〇〇87]进一步地,主机在将待写入数据的所有数据块都写入SD卡中后,可以发送停止命令停止写操作,在本实施例中,所述停止命令可以为CMD12。[〇〇88]进一步地,参照图3,图3为本发明读写SD卡的方法的第三实施例的流程示意图。基于上述方法的第二实施例提出本发明的第三实施例,在本实施例中,所述将待写入数据中的待写入数据块经SPI接口写入所述SD卡中的步骤之后,还包括:[〇〇89]步骤S24,接收所述SD卡的响应应答命令;[〇〇9〇]由于采用的是软件的方式模拟SPI接口与SD卡进行通讯,考虑到GP10接口可能受到干扰而引起数据的读写错误,比如,在对SD卡进行读或写操作的过程中,接收到另一终端的通话请求,由于通话功能的任务优先级高于采用软件的方式模拟SPI接口与SD卡进行通讯的任务优先级,因此,在接收到另一终端的通话请求后,会中断模拟SPI接口与SD卡进行通讯的软件的运行,从而出现挂起状态,引起数据的读写错误。因此,为了解决GP10接口可能受到干扰而引起数据的读写错误,可以在每次将数据块写入所述SD卡后,接收SD卡返回的响应应答命令,在本实施例中,所述响应应答命令为一个字节长度,具体为0x05,在本发明的其他实施例中,所述响应应答命令也可以为其他值,在本实施中,不做限定。主机在接收到SD卡的响应应答命令后,会判断所述响应应答命令是否正确,若所述响应应答命令正确,则表明当前写入的数据块没有出错,若所述响应应答命令不正确,则表明当前写入的数据块出错。若确定所述响应应答命令正确时,则执行步骤S23,即将所述待写入数据中当前写入的数据块的下一数据块作为待写入数据块;若确定所述响应应答命令不正确,则需要将当前写入的数据块进行重新写入SD卡中,具体的,可以通过将所述待写入数据中当前写入的数据块继续作为待写入数据块,然后再执行步骤S21,即通过所述SPI接口发送写操作命令至所述SD卡,以重新对该待写入数据块进行写操作,其中,本次发送的写操作命令为单块写操作命令。
[0091]本实施例通过在每次将待写入数据块写入所述SD卡后,接收SD卡的响应应答命令,以确定所述待写入数据块是否写入正确,从而提高写入数据的准确率。[〇〇92]进一步地,参照图4,图4为本发明读写SD卡的方法的第四实施例的流程示意图。基于上述方法的任一实施例提出本发明的第四实施例,在本实施例中,所述对所述SD卡进行读操作的步骤包括:[〇〇93]步骤S25,通过所述SPI接口发送读操作命令至所述SD卡;[〇〇94]步骤S26,在所述SPI接口接收到所述SD卡基于所述读操作命令反馈的响应数据, 且所述响应数据为预设值时,经所述SPI接口从所述SD卡中读取待读取数据的待读取数据块;
[0095]步骤S27,在读取到所述待读取数据块后,将所述待读取数据中当前读取的数据块的下一数据块作为待读取数据块。[〇〇96]由于SD卡读写都是通过发送CMD命令与通过接收响应应答来实现的,因此,在SD卡完成初始化后,主机若需要对SD卡进行读操作,则需要通过所述SPI接口发送读操作命令至所述SD卡,根据SD卡的传输协议,可以通过所述SPI接口发送单块写操作命令,比如,CMD17 命令,具体的,可以通过如下相关函数实现:
[0097]kal_uint32SD_Read_0ne_Block(kal_uint32data_adrs,kal_uint32*rxbufTer)〇
[0098]SD卡在接收到主机发送的读操作命令后,也会对所述读操作命令进行响应,响应数据包括针对所述读操作命令的返回值,以及起始令牌,该返回值可以为等,主机在接收到SD卡的返回值,会判断该返回值是否为预设值,比如,所述预设值为‘0’,若主机接收到SD卡的返回值为预设值,则会继续读取SD卡返回的起始令牌,并判断该返回的起始令牌是否正确,在本实施例中,若所述返回的起始令牌为0XFE时,表明起始令牌正确,主机随后会将对所述SD卡进行写操作,若所述返回的起始令牌不为0XFE时,不对所述SD卡进行写操作节。主机在将待读取数据从SD卡中读取出来时,也是以数据块为单位进行的,即每次在接收到SD卡基于所述读操作命令反馈的正确的响应数据后,只能经所述SPI接口从所述SD 卡中读取一个待读取数据块,因此,为了将待读取数据的剩下的数据块从SD卡读取出来中, 在读取到所述待读取数据块后,需要将所述待读取数据中当前读取的数据块的下一数据块作为待读取数据块,然后继续执行步骤S25,即通过所述SPI接口发送读操作命令至所述SD 卡,以便将当前读取的数据块的下一数据块从SD卡中读取出来,直至将所述待读取数据的所有数据块从所述SD卡中读取出来时,才不需要通过所述SPI接口发送读操作命令至所述 SD卡。需要说明的是,根据SD卡的传输协议,主机在将待读取数据的下一个数据块从SD卡中读取出来时,通过所述SPI接口发送的读操作命令应为多块读操作命令,比如CMD18命令,具体的,可以通过如下相关函数实现:
[0099]kal_uint32SD_Read_Multi_Blocks(kal_uint32data_adrs,kal_uint32* rxbuffer,kal_uint8sectors)〇
[0100]进一步地,主机在待读取数据的所有数据块都从SD卡中读取出来后,可以发送停止命令停止读操作,在本实施例中,所述停止命令为CMD12。可以通过如下函数实现停止命令的发送:
[0101]kal_uint32SD_ffrite_0ne_Bl〇ck(kal_uint32address,kal_uint32*txbuffer)〇
[0102]进一步地,参照图5,图5为本发明读写SD卡的方法的第五实施例的流程示意图。基于上述方法的第四实施例提出本发明的第五实施例,在本实施例中,所述将所述待读取数据中当前读取的数据块的下一数据块作为待读取数据的步骤之前,还包括:
[0103]步骤S28,在读取到所述待读取数据块后,判断所述待读取数据块中的校验码是否正确。
[0104]由于采用的是软件的方式模拟SPI接口与SD卡进行通讯,考虑到GP10接口可能受到干扰而引起数据的读写错误,比如,在对SD卡进行读或写操作的过程中,接收到另一终端的通话请求,由于通话功能的任务优先级高于采用软件的方式模拟SPI接口与SD卡进行通讯的任务优先级,因此,在接收到另一终端的通话请求后,会中断模拟SPI接口与SD卡进行通讯的软件的运行,从而出现挂起状态,引起数据的读写错误。因此,为了解决GP10接口可能受到干扰而引起数据的读写错误,可以在每次读取到所述待读取数据块后,判断所述待读取数据块中的校验码是否正确,具体的,可以通过所述待读取数据块中的数据按照预设的校验算法生成校验码,然后将生成的校验码与所述待读取数据块中的校验码进行比较, 以判断校验码是否正确,若生成的校验码与读取的校验码不相同,则表明本次读取操作出错,若生成的校验码与所述待读取数据块中的校验码相同,则表明本次读取操作未出错。若确定所述校验码正确时,则执行步骤S27,即将所述待读取数据中当前读取的数据块的下一数据块作为待读取数据块;若确定所述校验码不正确,则需要将当前读取的数据块重新从 SD卡中读取出来,具体的,可以通过将所述待读取数据中当前读取的数据块继续作为待读取数据块,然后再执行步骤S25,即通过所述SPI接口发送写操作命令至所述SD卡,以重新对该待读取数据块进行读取操作,其中,本次发送的读操作命令为单块读操作命令。
[0105]本实施例在每次将待读取数据块从所述SD卡读取后,通过判断校验码是否正确的方式来确定对所述待读取数据块的读取是否正确,从而提高读取数据的准确率。
[0106]本发明进一步提供一种读写SD卡装置。[〇1〇7]参照图6,图6为本发明读写SD卡装置的第一实施例的功能模块示意图。[〇1〇8]在本实施例中,所述读写SD卡的装置包括:初始化模块10及读写模块20。[〇1〇9]所述初始化模块10,用于通过模拟的SPI接口对所述SD卡进行初始化,其中,所述 SPI接口采用基带芯片的GP10接口模拟;[〇11〇]在本实施例中,由于现有的大部分低成本系统由于仅具有GP10接口,而GP10接口无法实现与SD卡之间的通信,以MTK6223D系统为例。使用MTK6223D系统的终端的基带芯片中不存在SPI接口,使得所述终端不支持SD卡的读写功能,然而可以采用所述基带芯片的 GP10接口模拟所述SPI接口的方式以实现对SD卡的读写功能的支持。比如,通过将SD卡的输出端、输入端、片选端和时钟信号端分别连接至所述基带芯片的GP1接口,然后对照SPI传输模式的时序图使用软件的方式来模拟SPI传输模式的时序。具体的,由于SD的命令、数据传输等,全部都是SPI传输模式的时序图来传输,因此,可以通过控制GP10接口的拉低、拉高来模拟SPI传输模式的时序,从而进行数据的传输,交互。
[0111]在通过软件的方式将基带芯片的GP10接口模拟所述SPI接口后,主机,即基带芯片通过模拟的SPI接口对SD卡进行初始化,具体的初始化流程主要包括以下步骤:
[0112]步骤1、发送74个时钟周期;
[0113]步骤2、发送复位命令,指令为CMD0;
[0114]步骤3、如果SD卡在接收到复位命令时,片选端低电平有效,则进入SPI模式;
[0115]步骤4、发送激活命令,指令为CMD1;
[0116] 步骤5、接收SD卡响应;
[0117] 步骤6、判断响应命令的bitO是否为‘0’ ;
[0118] 步骤7、若b i t0 = 0,则初始化完成。
[0119]在SD卡初始化完成后,主机可以通过CMD55指令和CMD41指令判断当前电压是否在工作范围内,还可以通过CMD10指令读取SD寄存器,通过CMD16指令设置读取接收block(块) 的长度,通过CMD9指令读取卡的CSD寄存器,从所述CSD寄存器中,主机(基带芯片)可以获取到卡的容量,支持的命令等重要参数。[〇12〇]所述读写模块20,用于在所述SD卡完成初始化后,对所述SD卡进行读/写操作。 [〇121]在SD卡完成初始化后,主机可以将数据写入SD卡中,或者将数据从SD卡中读取出来,即对所述SD卡进行读/写操作。若要将数据写入SD卡中,则可以通过所述SPI接口发送写操作命令至所述SD卡来实现,所述写操作命令包括单块写操作命令与多块写操作命令,所述单块写操作命令为将单个数据块写入SD中发送的命令,所述多块写操作命令为将多个数据块写入SD卡中发送的命令,即若待写入数据包括多个数据块,则首先发送单块写操作命令,进行数据写入操作,然后发送多块写操作命令,以便将剩余的数据块写入SD卡中。在本实施例中,所述单块写操作命令可以为CMD24,所述多块写操作命令为CMD25。
[0122]在SD卡完成初始化后,若要将数据写从SD卡中读取出来,则可以通过所述SPI接口发送读操作命令至所述SD卡来实现,所述读操作命令包括单块读操作命令与多块读操作命令,所述单块读操作命令为将单个数据块从所述SD中读取出来的命令,所述多块读操作命令为将多个数据块从所述SD中读取出来的命令,即若待读取数据包括多个数据块,则首先发送单块读操作命令,进行数据读取操作,然后发送多块读操作命令,以便将剩余的数据块从所述SD中读取出来。在本实施例中,所述单块读操作命令可以为CMD17,所述多块读操作命令为CMD18。
[0123]本发明将终端基带芯片的GP10接口模拟为SPI接口,并通过模拟的SPI接口对所述 SD卡进行初始化,在所述SD卡完成初始化后,通过模拟的SPI接口对SD卡进行读写操作,仅需要通过软件程序实现,而不需要增加额外的硬件芯片,降低了硬件成本。
[0124]进一步地,参照图7,图7为本发明读写SD卡的装置的第二实施例的功能模块示意图,基于上述装置第一实施例提出本发明的第二实施例,在本实施例中,所述读写模块20包括:发送单元21、写入单元22及作为单元23。
[0125] 所述发送单元21,用于通过所述SPI接口发送写操作命令至所述SD卡;
[0126]所述写入单元22,用于在所述SPI接口接收到所述SD卡基于所述写操作命令反馈的响应数据,且所述响应数据为预设值时,将待写入数据中的待写入数据块经SPI接口写入所述SD卡中;
[0127]所述作为单元23,还用于在将所述待写入数据块写入所述SD卡后,将所述待写入数据中当前写入的数据块的下一数据块作为待写入数据块;
[0128]所述发送单元21,还用于继续通过所述SPI接口发送写操作命令至所述SD卡,直至将所述待写入数据的所有数据块写入所述SD卡中。
[0129]由于SD卡读写都是通过发送CMD命令与通过接收响应应答来实现的,因此,在SD卡完成初始化后,主机若需要对SD卡进行写操作,则需要通过所述SPI接口发送写操作命令至所述SD卡,,根据SD卡的传输协议,可以通过所述SPI接口发送单块写操作命令,比如,CMD24 命令,具体的,可以通过如下相关函数实现:
[0130]kal_uint32SD_ffrite_0ne_Bl〇ck(kal_uint32address,kal_uint32*txbuffer)〇
[0131]SD卡在接收到主机发送的写操作命令后,会对所述读操作命令进行响应,响应数据以返回值的形式,该响应数据可以为等,主机在接收到SD卡反馈的响应的数据后,会判断响应的数据是否为预设值,比如,所述预设值为‘〇’,若主机接收到SD卡响应的数据为预设值,则会将待写入数据写入SD卡中。主机在将待写入数据写入SD卡中时,是以数据块为单位进行的,即每次在接收到SD卡基于所述写操作命令反馈的正确的响应数据后,只能将待写入数据中的一个待写入数据块经SPI接口写入所述SD卡中,因此,为了将待写入数据的剩下的数据块写入SD卡中,在将所述待写入数据块写入所述SD卡后,需要将待写入数据中当前写入的数据块的下一数据块作为待写入数据块,然后继续通过所述SPI接口发送写操作命令至所述SD卡,以便将当前写入的数据块的下一数据块写入SD卡中,直至将待写入数据的所有数据块写入所述SD卡中时,才不需要通过所述SPI接口发送写操作命令至所述SD卡。需要说明的是,根据SD卡的传输协议,主机在将待写入数据的下一个数据块写入SD 卡中时,通过所述SPI接口发送的写操作命令应为多块写操作命令,比如CMD25命令,具体的,可以通过如下相关函数实现:
[0132]kal_uint32SD_ffri te_Multi_Blocks(kal_uint32address,kal_uint32* txbuffer,kal_uint8blocks)〇
[0133]进一步地,主机在将待写入数据的所有数据块都写入SD卡中后,可以发送停止命令停止写操作,在本实施例中,所述停止命令为CMD12。
[0134]进一步地,参照图8,图8为本发明读写SD卡的装置的第三实施例的功能模块示意图,基于上述装置的第二实施例提出本发明的第三实施例,在本实施例中,所述读写模块20 还包括:接收单元24。
[0135]所述接收单元24,用于接收所述SD卡的响应应答命令;
[0136]所述作为单元23,还用于在所述响应应答命令正确时,将所述待写入数据中当前写入的数据块的下一数据块作为待写入数据块;
[0137]所述发送单元21,还用于在所述响应应答命令不正确时,将所述待写入数据中当前写入的数据块继续作为待写入数据块,并继续通过所述SPI接口发送写操作命令至所述 SD卡,直至将所述待写入数据的所有数据块写入所述SD卡中。
[0138]由于采用的是软件的方式模拟SPI接口与SD卡进行通讯,考虑到GP10接口可能受到干扰而引起数据的读写错误,比如,在对SD卡进行读或写操作的过程中,接收到另一终端的通话请求,由于通话功能的任务优先级高于采用软件的方式模拟SPI接口与SD卡进行通讯的任务优先级,因此,在接收到另一终端的通话请求后,会中断模拟SPI接口与SD卡进行通讯的软件的运行,从而出现挂起状态,引起数据的读写错误。。因此,为了解决GP1接口可能受到干扰而引起数据的读写错误,可以在每次将数据块写入所述SD卡后,接收SD卡返回的响应应答命令,在本实施例中,所述响应应答命令为一个字节长度,具体为0x05,在本发明的其他实施例中,所述响应应答命令也可以为其他值,在本实施中,不做限定。主机在接收到SD卡的响应应答命令后,会判断所述响应应答命令是否正确,若所述响应应答命令正确,则表明当前写入的数据块没有出错,若所述响应应答命令不正确,则表明当前写入的数据块出错。若确定所述响应应答命令正确时,则将所述待写入数据中当前写入的数据块的下一数据块作为待写入数据块;若确定所述响应应答命令不正确,则需要将当前写入的数据块进行重新写入SD卡中,具体的,可以通过将所述待写入数据中当前写入的数据块继续作为待写入数据块,然后再通过所述SPI接口发送写操作命令至所述SD卡,以重新对该待写入数据块进行写操作,其中,本次发送的写操作命令为单块写操作命令。
[0139]本实施例通过在每次将待写入数据块写入所述SD卡后,接收SD卡的响应应答命令,以确定所述待写入数据块是否写入正确,从而提高写入数据的准确率。
[0140]进一步地,参照图9,图9为本发明读写SD卡的装置的第四实施例的功能模块示意图,基于上述装置的第二或第三实施例提出本发明的第四实施例,在本实施例中,所述读写模块20还包括:读取单元25。
[0141]所述发送单元21,还用于通过所述SPI接口发送读操作命令至所述SD卡;
[0142]所述读取单元25,用于在所述SPI接口接收到所述SD卡基于所述读操作命令反馈的响应数据,且所述响应数据为预设值时,经所述SPI接口从所述SD卡中读取待读取数据的待读取数据块;
[0143]所述作为单元23,还用于在读取到所述待读取数据块后,将所述待读取数据中当前读取的数据块的下一数据块作为待读取数据块;
[0144]所述发送单元21,还用于继续通过所述SPI接口发送读操作命令至所述SD卡。
[0145]由于SD卡读写都是通过发送CMD命令与通过接收响应应答来实现的,因此,在SD卡完成初始化后,主机若需要对SD卡进行读操作,则需要通过所述SPI接口发送读操作命令至所述SD卡,,根据SD卡的传输协议,可以通过所述SPI接口发送单块写操作命令,比如,CMD17 命令,具体的,可以通过如下相关函数实现:
[0146]kal_uint32SD_Read_0ne_Block(kal_uint32data_adrs,kal_uint32*rxbufTer)〇
[0147]SD卡在接收到主机发送的读操作命令后,也会对所述读操作命令进行响应,响应数据包括针对所述读操作命令的返回值,以及起始令牌,该返回值可以为等,主机在接收到SD卡的返回值,会判断该返回值是否为预设值,比如,所述预设值为‘0’,若主机接收到SD卡的返回值为预设值,则会继续读取SD卡返回的起始令牌,并判断该返回的起始令牌是否正确,在本实施例中,若所述返回的起始令牌为0XFE时,表明起始令牌正确,主机随后会将对所述SD卡进行写操作,若所述返回的起始令牌不为0XFE时,不对所述SD卡进行写操作节。主机在将待读取数据从SD卡中读取出来时,也是以数据块为单位进行的,即每次在接收到SD卡基于所述读操作命令反馈的正确的响应数据后,只能经所述SPI接口从所述SD卡中读取一个待读取数据块,因此,为了将待读取数据的剩下的数据块从SD卡读取出来中, 在读取到所述待读取数据块后,需要将所述待读取数据中当前读取的数据块的下一数据块作为待读取数据块,然后继续通过所述SPI接口发送读操作命令至所述SD卡,以便将当前读取的数据块的下一数据块从SD卡中读取出来,直至将所述待读取数据的所有数据块从所述 SD卡中读取出来时,才不需要通过所述SPI接口发送读操作命令至所述SD卡。需要说明的是,根据SD卡的传输协议,主机在将待读取数据的下一个数据块从SD卡中读取出来时,通过所述SPI接口发送的读操作命令应为多块读操作命令,比如CMD18命令,具体的,可以通过如下相关函数实现:
[0148]kal_uint32SD_Read_Multi_Blocks(kal_uint32data_adrs,kal_uint32* rxbuffer,kal_uint8sectors)〇
[0149]进一步地,主机在待读取数据的所有数据块都从SD卡中读取出来后,可以发送停止命令停止读操作,在本实施例中,所述停止命令为CMD12。可以通过如下函数实现停止命令的发送:
[0150]进一步地,参照图10,图10为本发明读写SD卡的装置的第无实施例的功能模块示意图,基于上述装置的第四实施例提出本发明的第五实施例,在本实施例中,所述读写模块 20还包括:判断单元26。[0151 ]所述判断单元26,用于在读取到所述待读取数据块后,判断所述待读取数据块中的校验码是否正确;[〇152]所述作为单元23,还用于若所述校验码正确,则将所述待读取数据中当前读取的数据块的下一数据块作为待读取数据块;
[0153]所述发送单元21,还用于若所述校验码不正确,将所述待读取数据中当前读取的数据块继续作为待读取数据块,并继续通过所述SPI接口发送写操作命令至所述SD卡。 [〇154]由于采用的是软件的方式模拟SPI接口与SD卡进行通讯,考虑到GP10接口可能受到干扰而引起数据的读写错误,比如,在对SD卡进行读或写操作的过程中,接收到另一终端的通话请求,由于通话功能的任务优先级高于采用软件的方式模拟SPI接口与SD卡进行通讯的任务优先级,因此,在接收到另一终端的通话请求后,会中断模拟SPI接口与SD卡进行通讯的软件的运行,从而出现挂起状态,引起数据的读写错误。因此,为了解决GP10接口可能受到干扰而引起数据的读写错误,可以在每次读取到所述待读取数据块后,判断所述待读取数据块中的校验码是否正确,具体的,可以通过所述待读取数据块中的数据按照预设的校验算法生成校验码,然后将生成的校验码与所述待读取数据块中的校验码进行比较, 以判断校验码是否正确,若生成的校验码与读取的校验码不相同,则表明本次读取操作出错,若生成的校验码与所述待读取数据块中的校验码相同,则表明本次读取操作未出错。若确定所述校验码正确时,则将所述待读取数据中当前读取的数据块的下一数据块作为待读取数据块;若确定所述校验码不正确,则需要将当前读取的数据块重新从SD卡中读取出来, 具体的,可以通过将所述待读取数据中当前读取的数据块继续作为待读取数据块,然后再通过所述SPI接口发送写操作命令至所述SD卡,以重新对该待读取数据块进行读取操作。
[0155]本实施例在每次将待读取数据块从所述SD卡读取后,通过判断校验码是否正确的方式来确定对所述待读取数据块的读取是否正确,从而提高读取数据的准确率。
[0156]上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,空调器,或者网络设备等)执行本发明各个实施例所述的方法。
[0157]以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。
【主权项】
1.一种读写SD卡的方法,其特征在于,所述读写SD卡的方法包括以下步骤:通过模拟的SPI接口对所述SD卡进行初始化,其中,所述SPI接口采用基带芯片的GP1 接口模拟;在所述SD卡完成初始化后,对所述SD卡进行读/写操作。2.如权利要求1所述的读写SD卡的方法,其特征在于,所述对所述SD卡进行写操作的步 骤包括:通过所述SPI接口发送写操作命令至所述SD卡;在所述SPI接口接收到所述SD卡基于所述写操作命令反馈的响应数据,且所述响应数 据为预设值时,将待写入数据中的待写入数据块经SPI接口写入所述SD卡中;在将所述待写入数据块写入所述SD卡后,将所述待写入数据中当前写入的数据块的下 一数据块作为待写入数据块;继续执行所述通过所述SPI接口发送写操作命令至所述SD卡的步骤,直至将所述待写 入数据的所有数据块写入所述SD卡中。3.如权利要求2所述的读写SD卡的方法,其特征在于,所述将待写入数据中的待写入数 据块经SPI接口写入所述SD卡中的步骤之后,还包括:接收所述SD卡的响应应答命令;在所述响应应答命令正确时,执行所述将所述待写入数据中当前写入的数据块的下一 数据块作为待写入数据块的步骤;在所述响应应答命令不正确时,将所述待写入数据中当前写入的数据块继续作为待写 入数据块,并继续执行所述通过所述SPI接口发送写操作命令至所述SD卡的步骤。4.如权利要求1所述的读写SD卡的方法,其特征在于,所述对所述SD卡进行读操作的步 骤包括:通过所述SPI接口发送读操作命令至所述SD卡;在所述SPI接口接收到所述SD卡基于所述读操作命令反馈的响应数据,且所述响应数 据为预设值时,经所述SPI接口从所述SD卡中读取待读取数据的待读取数据块;在读取到所述待读取数据块后,将所述待读取数据中当前读取的数据块的下一数据块 作为待读取数据块;继续执行所述通过所述SPI接口发送读操作命令至所述SD卡的步骤,直至读取完所述 待读取数据的所有数据块。5.如权利要求4所述的读写SD卡的方法,其特征在于,所述将所述待读取数据中当前读 取的数据块的下一数据块作为待读取数据的步骤之前,还包括:在读取到所述待读取数据块后,判断所述待读取数据块中的校验码是否正确;若所述校验码正确,则执行所述将所述待读取数据中当前读取的数据块的下一数据块 作为待读取数据块的步骤;所述判断所述待读取数据块中的校验码是否正确的步骤之后,所述读写SD卡的方法还 包括步骤:若所述校验码不正确,将所述待读取数据中当前读取的数据块继续作为待读取数据 块,并继续执行所述通过所述SPI接口发送写操作命令至所述SD卡的步骤。6.—种读写SD卡的装置,其特征在于,所述读写SD卡的装置包括:初始化模块,用于通过模拟的SPI接口对所述SD卡进行初始化,其中,所述SPI接口采用 基带芯片的GP1接口模拟;读写模块,用于在所述SD卡完成初始化后,对所述SD卡进行读/写操作。7.如权利要求6所述的读写SD卡的装置,其特征在于,所述读写模块包括:发送单元,用于通过所述SPI接口发送写操作命令至所述SD卡;写入单元,用于在所述SPI接口接收到所述SD卡基于所述写操作命令反馈的响应数据, 且所述响应数据为预设值时,将待写入数据中的待写入数据块经SPI接口写入所述SD卡中;作为单元,用于在将所述待写入数据块写入所述SD卡后,将所述待写入数据中当前写 入的数据块的下一数据块作为待写入数据块;所述发送单元,还用于继续通过所述SPI接口发送写操作命令至所述SD卡,直至将所述 待写入数据的所有数据块写入所述SD卡中。8.如权利要求7所述的读写SD卡的装置,其特征在于,所述读写模块还包括:接收单元,用于接收所述SD卡的响应应答命令;所述作为单元,还用于在所述响应应答命令正确时,将所述待写入数据中当前写入的 数据块的下一数据块作为待写入数据块;所述发送单元,还用于在所述响应应答命令不正确时,将所述待写入数据中当前写入 的数据块继续作为待写入数据块,并继续通过所述SPI接口发送写操作命令至所述SD卡,直 至将所述待写入数据的所有数据块写入所述SD卡中。9.如权利要求7所述的读写SD卡的装置,其特征在于,所述读写模块还包括:所述发送单元,还用于通过所述SPI接口发送读操作命令至所述SD卡;读取单元,用于在所述SPI接口接收到所述SD卡基于所述读操作命令反馈的响应数据, 且所述响应数据为预设值时,经所述SPI接口从所述SD卡中读取待读取数据的待读取数据 块;所述作为单元,还用于在读取到所述待读取数据块后,将所述待读取数据中当前读取 的数据块的下一数据块作为待读取数据块;所述发送单元,还用于继续通过所述SPI接口发送读操作命令至所述SD卡。10.如权利要求9所述的读写SD卡的装置,其特征在于,所述读写模块还包括:判断单元,用于在读取到所述待读取数据块后,判断所述待读取数据块中的校验码是 否正确;所述作为单元,还用于若所述校验码正确,则将所述待读取数据中当前读取的数据块 的下一数据块作为待读取数据块;所述发送单元,还用于若所述校验码不正确,将所述待读取数据中当前读取的数据块 继续作为待读取数据块,并继续通过所述SPI接口发送写操作命令至所述SD卡。
【文档编号】G06K17/00GK106022406SQ201610331484
【公开日】2016年10月12日
【申请日】2016年5月18日
【发明人】赵卫东, 胡伟, 吴雄华
【申请人】深圳市微网力合信息技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1