找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3010|回复: 1
收起左侧

发一个C8051单片机U盘读写的程序供大家参考

[复制链接]
ID:277930 发表于 2018-1-20 03:44 | 显示全部楼层 |阅读模式
使用C8051F020单片机连接CH376S USB HOST芯片,生成CSV格式文件导入U盘内的一个小程序

单片机源程序如下:
  1. /*****************************************************************************
  2. ;File Name:                           基于C8051F020系列的简单U盘检测测试程序         
  3. ;
  4. ;description:            通过测量开发板上的CH375  检测是否有U  盘挂载
  5. ;Author:                王亮
  6. ;E_mail:                wangl@emsyschina.com
  7. *****************************************************************************/

  8. //-----------------------------------------------------------------------------
  9. // Includes
  10. //-----------------------------------------------------------------------------

  11. #include <c8051f020.h>                 // SFR declarations
  12. #include <stdio.h>      
  13. #include <intrins.h>      
  14. #include "CH375INC.H"      



  15. sbit CH375_nINT     = P1^2;                   // CH375   INT 输出
  16. sbit CH375_A0     = P1^3;                   // CH375 命令/数据控制
  17. sbit CH375_nCS     = P1^4;                   // CH375 片选信号


  18. #define CH375_DATA   P7                    // CH375 八位数据端口
  19. #define CH375_nWR     P4 &=  0x7F;    _nop_();_nop_();_nop_();_nop_();      P4 |= 0x80;               // CH375 写信号
  20. #define CH375_nRD_L     P4 &= 0xBF;             // CH375 读信号低电平
  21. #define CH375_nRD_H     P4 |= 0x40;               // CH375 读信号高电平
  22. #define BAUDRATE     115200            // Baud rate of UART in bps
  23. #define SYSCLK       22118400          // Output of PLL derived from (INTCLK*2)




  24. //-----------------------------------------------------------------------------
  25. // Function Prototypes
  26. //-----------------------------------------------------------------------------
  27. void OSCILLATOR_Init (void);           
  28. void PORT_Init (void);
  29. void UART0_Init (void);



  30. //**********************************************************
  31. // 大延迟程序(毫秒级)
  32. //**********************************************************
  33. void DelayMs(unsigned int i)
  34. {
  35.         unsigned int j;
  36.         for(;i!=0;i--)
  37.   {
  38.           for(j=200;j!=0;j--)
  39.            ;
  40.   }
  41. }

  42. //**********************************************************
  43. // 向CH375的命令端口写入命令
  44. //**********************************************************
  45. void CH375_WR_CMD_PORT(unsigned char cmd )
  46. {  
  47.         // 将CH375   数据线、读写、片选信号线设置为输出
  48.         P1MDOUT   = 0x18;                  // 将P7  和P4.6、P4.7、P1.3、P1.4设置为输出
  49.         P74OUT    = 0xC2;                    // 将P7  和P4.6、P4.7、P1.3、P1.4设置为输出
  50.        
  51.         CH375_A0 = 1;             // 高电平表示写入的是命令
  52.        
  53.         CH375_DATA = cmd;        // 将命令输出到CH375端口
  54.         _nop_();_nop_();
  55.        
  56.         CH375_nWR                 // 写命令
  57.         _nop_();_nop_();
  58.         CH375_A0 = 0;            
  59. }



  60. //**********************************************************
  61. // 向CH375的数据端口写入数据
  62. //**********************************************************
  63. void CH375_WR_DAT_PORT(unsigned char dat )
  64. {  
  65.         // 将CH375   数据线、读写、片选信号线设置为输出
  66.         P1MDOUT   = 0x18;                  // 将P7  和P4.6、P4.7、P1.3、P1.4设置为输出
  67.         P74OUT    = 0xC2;                    // 将P7  和P4.6、P4.7、P1.3、P1.4设置为输出
  68.        
  69.         CH375_A0 = 0;             // 低电平表示写入的是数据
  70.        
  71.         CH375_DATA = dat;        // 将命令输出到CH375端口
  72.         _nop_();_nop_();
  73.        
  74.         CH375_nWR                 // 写命令
  75. }



  76. //**********************************************************
  77. // 从CH375的数据端口读出数据
  78. //**********************************************************
  79. unsigned char CH375_RD_DAT_PORT( void )
  80. {   
  81.         unsigned char temp;

  82.         // 将CH375   数据线信号线设置为输入
  83.         P74OUT    = 0x02;
  84.         P7    = 0xff;
  85.                
  86.         CH375_A0 = 0;            

  87.         CH375_nRD_L
  88.         _nop_();_nop_();
  89.         temp = CH375_DATA;
  90.         CH375_nRD_H
  91.         _nop_();
  92.                
  93.           return( temp );   
  94. }

  95. //**********************************************************
  96. // 等待CH375中断并获取状态,返回操作状态
  97. //**********************************************************
  98. unsigned char mWaitInterrupt( void )
  99. {
  100.         while( CH375_nINT );  // 查询等待CH375操作完成中断(INT#低电平)
  101.        
  102.         CH375_WR_CMD_PORT( CMD_GET_STATUS );  //  产生操作完成中断,获取中断状态  
  103.        
  104.         return( CH375_RD_DAT_PORT( ) );
  105.   
  106. }



  107. //-----------------------------------------------------------------------------
  108. // main() Routine
  109. //-----------------------------------------------------------------------------

  110. void main (void)
  111. {
  112.         unsigned char Version = 0;
  113.         unsigned char Status = 0;
  114.         WDTCN = 0xde;                       // Disable watchdog timer
  115.         WDTCN = 0xad;

  116.         OSCILLATOR_Init ();                 // Initialize oscillator
  117.         PORT_Init ();                       // Initialize crossbar and GPIO
  118.         UART0_Init ();                      // Initialize UART1


  119.         CH375_nCS = 0;          // 片选选中CH375
  120.         DelayMs( 50 );
  121.          // 获取CH375  芯片及固件版本号,表明芯片正常
  122.         CH375_WR_CMD_PORT( CMD_GET_IC_VER );   
  123.         Version = CH375_RD_DAT_PORT( );
  124.         printf( "CH375 固件版本号%x\n", Version);

  125.        
  126.         CH375_WR_CMD_PORT( CMD_SET_USB_MODE );  // 初始化CH375,设置USB工作模式
  127.         CH375_WR_DAT_PORT( 6 );                                          // 模式代码,自动检测USB设备连接
  128.         while (1)
  129.         {
  130.                 Version = mWaitInterrupt();
  131.                 printf( "Insert USB disk%x\n",Version);
  132.                 DelayMs( 50 );
  133.     while ( mWaitInterrupt( ) != USB_INT_CONNECT );  // 等待U盘连接
  134.     DelayMs( 5000 );  // 延时等待U盘进入正常工作状态

  135.                        
  136.                 printf( "USB disk is  CONNECT\n" );       // 表示U  盘正常插入
  137.                 getchar();

  138.         }

  139.        
  140. }



  141. //-----------------------------------------------------------------------------
  142. // Initialization Subroutines
  143. //-----------------------------------------------------------------------------

  144. //-----------------------------------------------------------------------------
  145. // OSCILLATOR_Init
  146. //-----------------------------------------------------------------------------
  147. //
  148. // Return Value : None
  149. // Parameters   : None
  150. //
  151. // This routine initializes the system clock to use an 22.1184MHz crystal
  152. // as its clock source.
  153. //
  154. //
  155. //-----------------------------------------------------------------------------
  156. void OSCILLATOR_Init (void)
  157. {
  158.    int i;                              // delay counter

  159.    OSCXCN = 0x67;                      // start external oscillator with
  160.                                        // 22.1184MHz crystal

  161.    for (i=0; i < 256; i++) ;           // wait for oscillator to start

  162.    while (!(OSCXCN & 0x80)) ;          // Wait for crystal osc. to settle

  163.    OSCICN = 0x88;                      // select external oscillator as SYSCLK
  164.                                        // source and enable missing clock
  165.                                        // detector

  166. }


  167. //-----------------------------------------------------------------------------
  168. // PORT_Init
  169. //-----------------------------------------------------------------------------
  170. //
  171. // Return Value : None
  172. // Parameters   : None
  173. //
  174. // This function configures the crossbar and GPIO ports.
  175. //
  176. // P0.0   digital   push-pull     UART TX
  177. // P0.1   digital   open-drain    UART RX
  178. // AIN0.1 analog                  Analog input (no configuration necessary)
  179. //-----------------------------------------------------------------------------
  180. void PORT_Init (void)
  181. {
  182.         XBR0    = 0x04;                     // Route UART0 to crossbar
  183.         XBR2    |= 0x40;                    // Enable crossbar,  weak pull-ups
  184.        
  185.         P0MDOUT |= 0x01;                    // enable TX0 as a push-pull output

  186.         // 将CH375   数据线、读写、片选信号线设置为输出
  187.         P1MDOUT   = 0x18;                  // 将P7  和P4.6、P4.7、P1.3、P1.4设置为输出
  188. //        P74OUT    = 0xC2;                    // 将P7  和P4.6、P4.7、P1.3、P1.4设置为输出
  189.         P74OUT    = 0xC3;                    // 将P7  和P4.6、P4.7、P1.3、P1.4设置为输出
  190.        
  191.         P0MDOUT |= 0x01;                    // Set TX1 pin to push-pull

  192.         P1 |= 0x1c;                    //
  193. ……………………

  194. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
CH376.rar (83.19 KB, 下载次数: 18)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表