原创 AT89S52 + CH375 设备方式固件驱动程序

2010-6-9 13:06 3493 6 6 分类: MCU/ 嵌入式
这也算是进入USB通讯的第一步吧,以前一直搞串口,对于串口通信现在的固件驱动程序已经很稳定,使用时调用即可。想学点别的通信,像以太网啊,GPIB一类的,只不过目前USB很普及,决定开始搞USB了,对于初学者,当然使用CH375这个芯片了。简单!

     现在CH375的内置固件模式的通信已经搞定了,后续计划:外置固件模式  —>  主机方式。


     先把内置固件模式的程序贴出来吧,当时搞这个还是遇到了点问题,现在自己写这些程序都开始写成模块式的,也即黑盒子式,调用时只用在“Config.h”更改个别硬件接口定义就可以了。移植性很强,更改完硬件接口定义,直接可以移植到别的平台或者别的硬件电路。


     经验总结:调试这些通信接口像示波器等仪器是必不可少,但是还有一点特别重要,就是调试通信接口,最好用串口等来监测程序跑到哪一步了,到哪一步停了,用串口将程序状态信息实时传到电脑上显示出来,这是最重要的。下面这个程序中没有串口的调试程序,后续补上。


程序:


//主函数:检测到USB接到数据包标志位后,开始向PC机返回数据
//**********************************************************************************************************************


#include "config.h" 


main()
{
 //HardwareTest();
 //UartIni();   串口初始化
 CH375Ini();  //CH375 初始化
 while(1)
 {
  while(USBRecFlag)  //USB收到数据包标志,开始将数据返回给PC机
  {
   uint8 Count_Temp=0;
   USBRecFlag=0;
   USBSend_Data(USBBuffer,USBData_Len);
   USBReset();
  }  
  ;  
 }
}


//************************************************************************************************************************
//头文件,里面的硬件连接需要根据自己硬件尽兴相应的更改
//***********************************************************************************************************************


#ifndef _CONFIG_H_
#define _CONFIG_H_


#include "AT89X52.h"
#include "CH375INC.H"


/********************************************/
//*与硬件相关,需要根据自己的硬件来更改
sbit CH375_Read = 0x90 ;  //RD
sbit CH375_Write = 0x91;  //WR
sbit CH375_CS = 0X92;  //CS
sbit CH375_1Cmd_0Data = 0X93;  //A0
sfr CH375Port = 0xA0;  //P2 Port
/*******************************************/


#define USBDevice 0x02


#define USBBuffer_MaxLen 64


typedef unsigned char uint8;


extern uint8 USBBuffer[64];
extern bit USBRecFlag;
extern uint8 USBData_Len;


extern void USBSend_Data(uint8 *USBSendBuffer,uint8 SendBuffer_Len);
extern void CH375Ini();
extern void SDelay(uint8 DelayNum);
extern void CH375_WriteCmd(uint8 CH375Command);
extern void CH375_WriteData(uint8 CH375Data);
extern uint8 CH375_ReadData();
extern bit CH375SelfTest();
extern void CH375Disable();
extern void CH375Write_Mode(uint8 CH375Mode);
extern void USBInt();
extern void USBReset();


#endif
//***********************************************************************************************************************


//CH375的驱动程序,核心部分
//************************************************************************************************************************


#include "config.h"


bit USBRecFlag="0";  //USB接收到数据包后的标志位
uint8 USBBuffer[64]={0};  //USB接收数据缓冲区
uint8 USBData_Len=0;   //USB数据包长度


/////////////////////////////////////
/*函数描述:短延迟
/*写入参数:Delaynum,延迟时间:不详
/*返回参数:无
/*作者:Mikewang
/*日期:2008.**.**
/*描述:
/*     DelayNum="1"  ===>   22uS
       DelayNum="10" ===>   80uS
*////////////////////////////////////
void SDelay(unsigned char DelayNum)
{
 while(DelayNum--);
}
/////////////////////////////////////
/*函数描述:CH375处于无效状态
/*写入参数:无
/*返回参数:无
/*作者:Mikewang
/*日期:2009.07.22
/*描述:
/*     读、写无效
*////////////////////////////////////
void CH375Disable()
{
 //add
 CH375_CS=0;
 CH375_Read=1;
 CH375_Write=1;
 CH375_1Cmd_0Data=0;
}
/////////////////////////////////////
/*函数描述:CH375初始化
/*写入参数:无
/*返回参数:无
/*作者:Mikewang
/*日期:2009.07.22
/*描述:
/*      初始化顺序:硬件复位,自测试(循环),写模式,开中断
*////////////////////////////////////
void CH375Ini()
{
 EX0=1;         //Disable all interrupt
 CH375Disable();
 CH375_WriteCmd(CMD_RESET_ALL) ;
 SDelay(1000);
 while(!CH375SelfTest())
 {
  ;
  //Print error message
 }
 CH375Write_Mode(USBDevice);
 EX0=1;
 EA=1;          // EX0=1,EA=1
}
/////////////////////////////////////
/*函数描述:CH375初始化
/*写入参数:无
/*返回参数:无
/*作者:Mikewang
/*日期:2009.07.22
/*描述:
/*      测试数据:0XAA,
        返回数值:0   自测试失败
            1   自测试成功
*////////////////////////////////////
bit CH375SelfTest()
{
  uint8 DataTest;
  CH375_WriteCmd(CMD_CHECK_EXIST);
  SDelay(2);
  CH375_WriteData(0XAA);
  DataTest="CH375"_ReadData(); 
  if(DataTest == 0X55)
  {
   //UartTrans("USB Self Test OK!\n",18);
  return 1;
  }
     else
  {
   //UartTrans("USB Self Test Error!\n",21);
  return 0;
  }
}
/////////////////////////////////////
/*函数描述:CH375写命令函数
/*写入参数:命令控制字
/*返回参数:无
/*作者:Mikewang
/*日期:2009.07.22
/*描述:
/*     
*////////////////////////////////////
void CH375_WriteCmd(uint8 CH375Command)
{
 uint8 Command_Temp = CH375Command;
 CH375_CS=0;
 CH375_1Cmd_0Data = 1;
 CH375Port = Command_Temp;
 SDelay(2);
 CH375_Write=0;
 SDelay(1);
 CH375Disable();
}
/////////////////////////////////////
/*函数描述:CH375写数据
/*写入参数:数据
/*返回参数:无
/*作者:Mikewang
/*日期:2009.07.22
/*描述:
/* 2009.07.22 :V1.0:
/* 2009.07.27 : V2.0: 从子程序中去除CH375Disable(),在连续写数据过程中不能将CS变高,移到写完整个数据块后在Disable   
*////////////////////////////////////
void CH375_WriteData(uint8 CH375Data)
{
 uint8 CH375Data_Temp = CH375Data;
 CH375_CS=0;
 CH375_1Cmd_0Data = 0;
 CH375Port = CH375Data_Temp;
 SDelay(2);
 CH375_Write=0;
 SDelay(1);
 CH375_Write=1;
}
/////////////////////////////////////
/*函数描述:CH375读数据
/*写入参数:无
/*返回参数:读出数据
/*作者:Mikewang
/*日期:2009.07.22
/*描述:
/* 2009.07.22   , V1.0
/*2009.07.27   ,  V2.0  :在子程序中去出了CH375Disable()函数
/*     原因:在批量数据读取时,CS线不能变低。将这部分功能移动到了数据读取完后再进行Disable    
*////////////////////////////////////
uint8 CH375_ReadData()
{
 uint8 USBData;
 CH375Port=0XFF;
 CH375_CS=0;
 CH375_Read=0;
 SDelay(2);
 USBData=CH375Port;
 SDelay(1);
 CH375_Read=1;
 return USBData;
}
/////////////////////////////////////
/*函数描述:CH375写模式
/*写入参数:模式数据
/*返回参数:无
/*作者:Mikewang
/*日期:2009.07.22
/*描述:
/*      写完命令自测试
*////////////////////////////////////
void CH375Write_Mode(uint8 CH375Mode)
{
 //add
 uint8 CH375Mode_Temp = CH375Mode;
 CH375_WriteCmd(CMD_SET_USB_MODE);
 SDelay(2);
 CH375_WriteData(CH375Mode_Temp);
 while(CH375_ReadData()!=CMD_RET_SUCCESS)
 {
  ;
  //Print error message
 }
 //UartTrans("USB Set Mode OK!\n",17);
 CH375Disable();
}
/////////////////////////////////////
/*函数描述:CH375缓冲区复位
/*写入参数:无
/*返回参数:无
/*作者:Mikewang
/*日期:2009.07.27
/*描述:
/*      长度清零、缓冲区清零
*////////////////////////////////////
void USBReset()
{
 uint8 Count_Temp;
 for(Count_Temp=0;Count_Temp<USBBuffer_MaxLen;Count_Temp++)
 {
  USBBuffer[Count_Temp]=0;
 }
 USBData_Len = 0;
}
/////////////////////////////////////
/*函数描述:CH375发送数据
/*写入参数:数据以及数据包的长度
/*返回参数:无
/*作者:Mikewang
/*日期:2009.07.27
/*描述:
/*     
*////////////////////////////////////
void USBSend_Data(uint8 *USBSendBuffer,uint8 SendBuffer_Len)
{
 //add
 uint8  Count_Temp;
 CH375_WriteCmd(CMD_WR_USB_DATA7);
 CH375_WriteData(SendBuffer_Len);
 for(Count_Temp=0;Count_Temp<USBData_Len;Count_Temp++)
 {
  CH375_WriteData(*(USBSendBuffer+Count_Temp));
 }
 CH375Disable();
}
/////////////////////////////////////
/*函数描述:CH375中断
/*写入参数:无
/*返回参数:无
/*作者:Mikewang
/*日期:2009.07.22
/*描述:
/*      中断源:INT0
/*      缓冲区:USBBuffer[]
/*      长度  :USBData_Len ,Maxlen=64
*////////////////////////////////////
void USBint() interrupt IE0_VECTOR
{
 //add
 uint8 USBStatus;
 uint8 Count_Temp;
 EX0=0;
 CH375_WriteCmd(CMD_GET_STATUS);
    SDelay(1);
 USBStatus=CH375_ReadData();
 switch(USBStatus)
 {
  case USB_INT_EP1_OUT:
   {
     ;
   }
   break;
  case USB_INT_EP1_IN:
   CH375_WriteCmd(CMD_UNLOCK_USB);
   break;
  case USB_INT_EP2_OUT:
   {
     CH375_WriteCmd(CMD_RD_USB_DATA);
     USBData_Len=CH375_ReadData();  //接收长度
     if(USBData_Len>64)
     {
      USBData_Len=64;
     }
      //UartTrans("USB Receive Data From EP2\nLen:",30);
      //UartTransData(USBData_Len);  //串口打印长度
     for(Count_Temp=0;Count_Temp< USBData_Len;Count_Temp++)  //接收数据块
     {
     USBBuffer[Count_Temp]=CH375_ReadData();
     }
     USBRecFlag="1";
      //UartTrans("\nUSB Receive Data From EP2\nData:",33);
     //UartTrans(USBBuffer,USBData_Len);  //串口打印USB发送的数据
     CH375Disable();
   }
   break;
  case USB_INT_EP2_IN:
   CH375_WriteCmd(CMD_UNLOCK_USB);
   break;
  case USB_INT_USB_SUSPEND:
   break;
  case USB_INT_WAKE_UP:
   break;
  default:
   break;
 }
 EX0=1;
}


**********************************************************************************************************************


编程流程:


【原创】AT89S52 + CH375 设备方式固件驱动程序 - 精灵 - 朝亿夕拾


原文地址:http://qmstart1984.blog.163.com/blog/static/120691293200972105751425/

文章评论0条评论)

登录后参与讨论
我要评论
0
6
关闭 站长推荐上一条 /2 下一条