/* CH376芯片 硬件标准SPI串行连接的硬件抽象层 V1.0 */

/* 提供I/O接口子程序 */

#include        "HAL.H"

/* 本例中的硬件连接方式如下(实际应用电路可以参照修改下述定义及子程序) */

/* 单片机的引脚    CH376芯片的引脚

P1.4                 SCS

P1.5                 SDI

P1.6                 SDO

P1.7                 SCK      */

#define        CH376_SPI_SCS                        P14                /* 假定CH376的SCS引脚 */

#define        CH376_SPI_SDO                        P16                /* 假定CH376的SDO引脚 */

sfr                SPDR = 0x86;        /* SPI数据寄存器 */

sfr                SPSR = 0xAA;        /* SPI状态寄存器 */

sfr                SPCR = 0xD5;    /* SPI控制寄存器 */

#define        SPI_IF_TRANS        0x80        /* SPI字节传输完成标志,在SPSR的位7 */

#define CH376_INT_WIRE                        INT0        /* 假定CH376的INT#引脚,如果未连接那么也可以通过查询兼做中断输出的SDO引脚状态实现 */

void        CH376_PORT_INIT( void )  /* 由于使用SPI读写时序,所以进行初始化 */

{

/* 如果是硬件SPI接口,那么可使用mode3(CPOL=1&CPHA=1)或mode0(CPOL=0&CPHA=0),CH376在时钟上升沿采样输入,下降沿输出,数据位是高位在前 */

CH376_SPI_SCS = 1;  /* 禁止SPI片选 */

/* 对于双向I/O引脚模拟SPI接口,那么必须在此设置SPI_SCS,SPI_SCK,SPI_SDI为输出方向,SPI_SDO为输入方向 */

SPCR = 0x5C;  /* 设置SPI模式3, DORD=0(MSB first), CPOL=1, CPHA=1, CH376也支持SPI模式0 */

}

void        mDelay0_5uS( void )  /* 至少延时0.5uS,根据单片机主频调整 */

{

}

UINT8        Spi376Exchange( UINT8 d )  /* 硬件SPI输出且输入8个位数据 */

{  /* 为了提高速度,可以将该子程序做成宏以减少子程序调用层次 */

SPDR = d;  /* 先将数据写入SPI数据寄存器,然后查询SPI状态寄存器以等待SPI字节传输完成 */

while ( ( SPSR & SPI_IF_TRANS ) == 0 );  /* 查询SPI状态寄存器以等待SPI字节传输完成 */

SPSR &= ~ SPI_IF_TRANS;  /* 清除SPI字节传输完成标志,有的单片机会自动清除 */

return( SPDR );  /* 先查询SPI状态寄存器以等待SPI字节传输完成,然后从SPI数据寄存器读出数据 */

}

#define        xEndCH376Cmd( )        { CH376_SPI_SCS = 1; }  /* SPI片选无效,结束CH376命令,仅用于SPI接口方式 */

void        xWriteCH376Cmd( UINT8 mCmd )  /* 向CH376写命令 */

{

#ifdef        CH376_SPI_BZ

UINT8        i;

#endif

CH376_SPI_SCS = 1;  /* 防止之前未通过xEndCH376Cmd禁止SPI片选 */

/* 对于双向I/O引脚模拟SPI接口,那么必须确保已经设置SPI_SCS,SPI_SCK,SPI_SDI为输出方向,SPI_SDO为输入方向 */

CH376_SPI_SCS = 0;  /* SPI片选有效 */

Spi376Exchange( mCmd );  /* 发出命令码 */

#ifdef        CH376_SPI_BZ

for ( i = 30; i != 0 && CH376_SPI_BZ; -- i );  /* SPI忙状态查询,等待CH376不忙,或者下面一行的延时1.5uS代替 */

#else

mDelay0_5uS( ); mDelay0_5uS( ); mDelay0_5uS( );  /* 延时1.5uS确保读写周期大于1.5uS,或者用上面一行的状态查询代替 */

#endif

}

#ifdef        FOR_LOW_SPEED_MCU  /* 不需要延时 */

#define        xWriteCH376Data( d )        { Spi376Exchange( d ); }  /* 向CH376写数据 */

#define        xReadCH376Data( )                ( Spi376Exchange( 0xFF ) )  /* 从CH376读数据 */

#else

void        xWriteCH376Data( UINT8 mData )  /* 向CH376写数据 */

{

Spi376Exchange( mData );

//        mDelay0_5uS( );  /* 确保读写周期大于0.6uS */

}

UINT8        xReadCH376Data( void )  /* 从CH376读数据 */

{

//        mDelay0_5uS( );  /* 确保读写周期大于0.6uS */

return( Spi376Exchange( 0xFF ) );

}

#endif

/* 查询CH376中断(INT#低电平) */

UINT8        Query376Interrupt( void )

{

#ifdef        CH376_INT_WIRE

return( CH376_INT_WIRE ? FALSE : TRUE );  /* 如果连接了CH376的中断引脚则直接查询中断引脚 */

#else

return( CH376_SPI_SDO ? FALSE : TRUE );  /* 如果未连接CH376的中断引脚则查询兼做中断输出的SDO引脚状态 */

#endif

}

UINT8        mInitCH376Host( void )  /* 初始化CH376 */

{

UINT8        res;

CH376_PORT_INIT( );  /* 接口硬件初始化 */

xWriteCH376Cmd( CMD11_CHECK_EXIST );  /* 测试单片机与CH376之间的通讯接口 */

xWriteCH376Data( 0x65 );

res = xReadCH376Data( );

xEndCH376Cmd( );

if ( res != 0x9A ) return( ERR_USB_UNKNOWN );  /* 通讯接口不正常,可能原因有:接口连接异常,其它设备影响(片选不唯一),串口波特率,一直在复位,晶振不工作 */

xWriteCH376Cmd( CMD11_SET_USB_MODE );  /* 设备USB工作模式 */

xWriteCH376Data( 0x06 );

mDelayuS( 20 );

res = xReadCH376Data( );

xEndCH376Cmd( );

#ifndef        CH376_INT_WIRE

#ifdef        CH376_SPI_SDO

xWriteCH376Cmd( CMD20_SET_SDO_INT );  /* 设置SPI的SDO引脚的中断方式 */

xWriteCH376Data( 0x16 );

xWriteCH376Data( 0x90 );  /* SDO引脚在SCS片选无效时兼做中断请求输出 */

xEndCH376Cmd( );

#endif

#endif

if ( res == CMD_RET_SUCCESS ) return( USB_INT_SUCCESS );

else return( ERR_USB_UNKNOWN );  /* 设置模式错误 */

}

C语言以延时的状态读取数据文件,CH376 U盘文件读写相关C语言代码相关推荐

  1. R语言可以直接从数据库读取数据么?R语言读取数据库数据示例

    R语言可以直接从数据库读取数据么?R语言读取数据库数据示例 目录 R语言可以直接从数据库读取数据么?R语言读取数据库数据示例 R语言是解决什么问题的? R语言可以直接从数据库读取数据么?R语言读取数据 ...

  2. Opencv——写入或读取数据到XML或YAML文件

    什么是XML.YAML文件 XML(eXtensible Markup Language)是一种元标记语言.所谓"原标记",就是开发者可以根据自身需要定义的标记,任何满足XML命名 ...

  3. C# 多线程读取数据并保存在DataGridView中,如果操作?代码是什么?谢谢

    说个大概吧. 首先有一个读取数据的方法getData. 该方法里面有 获取数据A和放入DataGridView的操作. 然后有个总的方法getAllData来New 线程,线程调用getData方法, ...

  4. 使用C#语言,从Excel2007中读取数据,并显示到Form中的DataGridView。

    转载自:http://blog.csdn.net/zhangnan20100811/article/details/6458158 using System; using System.Collect ...

  5. java按列读取数据再存储_Java指定行读写数据

    /** * 根据指定行写数据 * * @param lineNumber 要存的行数 * @param data 要存储的数据 */ public static void setAppointedLi ...

  6. python从文件中读取数据时出现错误_python-从文件中读取数据

    一.读取整个文件 learnFile.py 绝对路径 #coding=UTF-8 importsys reload(sys) with open(r'C:\Users\zhujiachun\Deskt ...

  7. r语言 发送邮件html,r语言读取数据的方法

    R 对于基于 SQL 语言的关系型数据库有良好的支持,这些数据库既有商业数据库 Oracle.Microsoft SQL Server.IBM DB2 等,也包含在 GNUGeneral Public ...

  8. R语言dplyr包移除dataframe数据列实战(Remove Columns)

    R语言dplyr包移除dataframe数据列实战(Remove Columns) 目录 R语言dplyr包移除dataframe数据列实战(Remove Columns) #导入包和仿真数据

  9. android获取错误原因,从http读取数据时发生OutOfMemory错误获取请求android

    我正在做一个http获取请求.我需要接收大量数据,但在读取数据时出现OutOfMemory异常.从http读取数据时发生OutOfMemory错误获取请求android 我的代码: public st ...

最新文章

  1. nodejs系列-翻译http
  2. IIS 7 应用程序池自动回收关闭的解决方案
  3. TLSNotary中心化预言机(3) 下一代技术----PADVA
  4. TClientDataSet[3]: 手动建立数据集
  5. rabbitmq管理界面的使用
  6. ie6 7下 relative absolute无法冲破的等级问题解决办法
  7. phpcmsV9首页loop文章调用顶级栏目名称
  8. 宅在家里写数据库中MD5加密
  9. Buffer对象与JSON对象相互转换
  10. Docker的使用(未完待续)
  11. putty远程登录linux无ssh,收集的linux远程ssh连接putty失败解决办法!
  12. godot读写本地文件
  13. Kali Linux 软件源与更新源和更新命令
  14. 如何防止黑客入侵服务器?
  15. 备战金九银十 你必须知道的Mybatis面试题
  16. 计算机专业公务员歧视,考研,是我这辈子最后悔的事?工作找不到,公务员不能考!...
  17. Greenplum小把戏 - 判断数值是否在区间内
  18. C#学习笔记:GDI图形高级编程(1)——如何将图形画到控件上
  19. 解析微信小程序真正的作用
  20. bit、byte、KB、M、G、T相互关系

热门文章

  1. 软件测试质量提升方案(初稿)
  2. Google 天气预报 API
  3. 用Silverlight做淘宝应用
  4. 叙述两个计算机应用,计算机应用基础模拟试卷2
  5. git 如何提交丰富的emoji表情
  6. 微星MAG B650M mortar wifi主板设置温度墙
  7. PDF417码制尺寸定义
  8. minecraft_我们未来的机器人影响者:尝试使用Minecraft玩的Twitch流媒体机器人
  9. 做好这三步,你的小程序离“爆款”就不远了
  10. Mysql8.x安装教程