现在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;
}
**********************************************************************************************************************
编程流程:
原文地址:http://qmstart1984.blog.163.com/blog/static/120691293200972105751425/
文章评论(0条评论)
登录后参与讨论