原创 MSP430上的CH372V的初始化程序

2007-7-27 23:07 4656 6 6 分类: MCU/ 嵌入式

今天下午才弄好CH372V的小模块  初始化一下才能被计算机识别的 所以赶忙写了一个初始化程序 赫赫 放上来 大家可以修改或者继续完善


 


#include  <msp430x14x.h>


#define CH372V_DIR  P1DIR
#define CH372V_IN  P1IN
#define CH372V_OUT  P1OUT


#define CH372V_WR  BIT0
#define CH372V_WR_DIR  P2DIR
#define CH372V_WR_OUT  P2OUT
#define CH372V_WR_LO  CH372V_WR_OUT &= ~CH372V_WR
#define CH372V_WR_HI  CH372V_WR_OUT |= CH372V_WR


#define CH372V_RD  BIT1
#define CH372V_RD_DIR  P2DIR
#define CH372V_RD_OUT  P2OUT
#define CH372V_RD_LO  CH372V_RD_OUT &= ~CH372V_RD
#define CH372V_RD_HI  CH372V_RD_OUT |= CH372V_RD


#define CH372V_A0  BIT2
#define CH372V_A0_DIR  P2DIR
#define CH372V_A0_OUT  P2OUT
#define CH372V_A0_LO  CH372V_A0_OUT &= ~CH372V_A0
#define CH372V_A0_HI  CH372V_A0_OUT |= CH372V_A0


#define CH372V_CS  BIT3
#define CH372V_CS_DIR  P2DIR
#define CH372V_CS_OUT  P2OUT
#define CH372V_CS_LO  CH372V_CS_OUT &= ~CH372V_CS
#define CH372V_CS_HI  CH372V_CS_OUT |= CH372V_CS


#define CH372V_INT  BIT5
#define CH372V_INT_DIR  P2DIR
#define CH372V_INT_IN  P2IN


// CH372V 命令定义
#define CH372V_RESET_ALL  0x05 //执行硬件复位
#define CH372V_CHECK_EXIST  0x06 //测试工作状态
#define CH372V_SET_SUB_ID  0x12 //设置VID和PID
#define CH372V_SET_USB_MODE  0x15 //设置USB工作模式
#define CH372V_GET_STATUS  0x22 //获取中断状态
#define CH372V_UNLOCK_USB  0x23 //释放USB缓冲区
#define CH372V_RD_USB_DATA  0x28 //从USB端点中断读取数据并释放缓冲区
#define CH372V_WR_USB_DATA5  0x2A //向USB端点1缓冲区写数据
#define CH372V_WR_USB_DATA7  0x2B //向USB端点2缓冲区写数据
#define CH372V_GET_IC_VER  0x01 //获取芯片和固件版本
#define CH372V_ENTER_SLEEP  0x03 //进入低功耗睡眠挂起状态
#define CH372V_CHK_SUSPEND  0x0B //检查USB总线挂起方式状态
#define CH372V_RD_USB_DATA0  0x27 //USB端点中断读取数据


// CH372V 状态定义
#define CH372V_CMD_RET_SUCCESS  0x51 //操作成功
#define CH372V_CMD_RET_ABORT  0x5F //操作失败


// CH372V 中断状态
#define CH372V_USB_INT_BUS_RESET1 0x03 //检测到USB总线复位
#define CH372V_USB_INT_BUS_RESET2 0x07 //检测到USB总线复位
#define CH372V_USB_INT_BUS_RESET3 0x0B //检测到USB总线复位
#define CH372V_USB_INT_BUS_RESET4 0x0F //检测到USB总线复位
#define CH372V_USB_INT_EP0_SETUP 0x0C //端点0的接收器接收到数据,SETUP 成功
#define CH372V_USB_INT_EP0_OUT  0x00 //检端点0的接收器接收到数据,OUT功
#define CH372V_USB_INT_EP0_IN  0x08 //端点0的发送器发送完数据,IN成功
#define CH372V_USB_INT_EP1_OUT  0x01 //辅助端点/端点1接收到数据,OUT成功
#define CH372V_USB_INT_EP1_IN  0x09 //中断端点/端点1发送完数据,IN成功
#define CH372V_USB_INT_EP2_OUT  0x02 //批量端点/端点2接收到数据,OUT成功
#define CH372V_USB_INT_EP2_IN  0x0A //批量端点/端点2发送完数据,IN成功
#define CH372V_USB_INT_USB_SUSPEND 0x05 //USB总线挂起事件(如果已CHK_SUSPEND)
#define CH372V_USB_INT_WAKE_UP  0x06 //从睡眠中被唤醒事件(如果已ENTER_SLEEP)


#define CH372V_VID   4378 //VID厂商标识码
#define CH372V_PID   5537 //PID产品识别码


#define MCLK    4000 //MSP430主时钟用于延时


void Delay10us(unsigned int dtime);
void InitOsc(void);
void CH372V_Init(void);
void CH372V_SendCMD1(unsigned char Command);
void CH372V_SetVIDPID(void);
unsigned char CH372V_SendCMD2(unsigned char Command,unsigned char Parameter);


unsigned char WatchPoint;


void main(void)
{
 WDTCTL = WDTPW + WDTHOLD;
 InitOsc();
 CH372V_Init();
 while(1);
}


void CH372V_Init(void)
{
 //首先初始化端口
 CH372V_DIR |= 0xFF;
 CH372V_WR_HI;   //WR无效
 CH372V_WR_DIR |= CH372V_WR;
 CH372V_RD_HI;   //RD无效
 CH372V_RD_DIR |= CH372V_RD;
 CH372V_CS_HI;   //CS无效
 CH372V_CS_DIR |= CH372V_CS;
 CH372V_A0_HI;   //A0=1命令
 CH372V_A0_DIR |= CH372V_A0;
 //第一部分硬件复位
 CH372V_SendCMD1(0x05);
 Delay10us(4000);  //延时40ms
 //第二部分设置VID和PID
 CH372V_SetVIDPID();
 //第三部分设置USB工作模式
 WatchPoint = CH372V_SendCMD2(0x15,0x02);
 _NOP();    //Add BreakPoint here
}


//发送单字节命令
void CH372V_SendCMD1(unsigned char Command)
{
 CH372V_DIR = 0xFF;
 CH372V_OUT = Command;  //发送数据
 CH372V_A0_HI;   //A0=1命令
 CH372V_CS_LO;   //CS有效
 CH372V_WR_LO;   //WR有效
 _NOP();_NOP();_NOP();
 CH372V_WR_HI;   //WR无效
 CH372V_CS_HI;   //CS无效
}


//设置VID和PID
void CH372V_SetVIDPID(void)
{
 unsigned char itemp;
 
 CH372V_DIR = 0xFF;
 CH372V_OUT = 0x12;
 CH372V_CS_LO;   //CS有效
 CH372V_A0_HI;   //A0=1命令
 CH372V_WR_LO;   //WR有效
 _NOP();_NOP();_NOP();
 CH372V_WR_HI;   //WR无效
 _NOP();_NOP();_NOP();
 
 itemp = (unsigned char)(CH372V_VID&0xff); //VID低字节
 CH372V_OUT = 0x48;//itemp;
 CH372V_A0_LO;   //A0=0数据
 CH372V_WR_LO;   //WR有效
 _NOP();_NOP();_NOP();
 CH372V_WR_HI;   //WR无效
 _NOP();_NOP();_NOP();
 
 itemp = (unsigned char)((CH372V_VID>>8)&0xff); //VID高字节
 CH372V_OUT = 0x43;//itemp;
 CH372V_A0_LO;   //A0=0数据
 CH372V_WR_LO;   //WR有效
 _NOP();_NOP();_NOP();
 CH372V_WR_HI;   //WR无效
 _NOP();_NOP();_NOP();
 
 itemp = (unsigned char)(CH372V_PID&0xff); //PID低字节
 CH372V_OUT = 0x37;//itemp;
 CH372V_A0_LO;   //A0=0数据
 CH372V_WR_LO;   //WR有效
 _NOP();_NOP();_NOP();
 CH372V_WR_HI;   //WR无效
 _NOP();_NOP();_NOP();
 
 itemp = (unsigned char)((CH372V_PID>>8)&0xff); //PID高字节
 CH372V_OUT = 0x55;//itemp;
 CH372V_A0_LO;   //A0=0数据
 CH372V_WR_LO;   //WR有效
 _NOP();_NOP();_NOP();
 CH372V_WR_HI;   //WR无效
 CH372V_CS_HI;   //CS无效
 _NOP();_NOP();_NOP();
}


//发送带有返回的单字节命令
unsigned char CH372V_SendCMD2(unsigned char Command,unsigned char Parameter)
{
 unsigned char result;
 
 CH372V_DIR = 0xFF;
 CH372V_OUT = Command;  //发送数据
 CH372V_CS_LO;   //CS有效
 CH372V_A0_HI;   //A0=1命令
 CH372V_WR_LO;   //WR有效
 _NOP();_NOP();_NOP();
 CH372V_WR_HI;   //WR无效
 
 _NOP();_NOP();_NOP();
 
 CH372V_OUT = Parameter;  //发送数据
 CH372V_A0_LO;   //A0=0命令
 CH372V_WR_LO;   //WR有效
 _NOP();_NOP();_NOP();
 CH372V_WR_HI;   //WR无效
 
 Delay10us(2);
 
 CH372V_DIR = 0x00;
 CH372V_RD_LO;   //RD有效
 _NOP();_NOP();_NOP();
 result = CH372V_IN;  //读取数据
 CH372V_RD_HI;   //RD无效
 CH372V_CS_HI;   //CS无效
 CH372V_DIR = 0xFF;
 return result;
}


void Delay10us(unsigned int dtime){
 unsigned int i,j;
 for(j=0;j<dtime;j++){
  for(i=0;i<((MCLK/500)-3);i++);
 }
}


void InitOsc(void)
{ //MCLK=SMLCLK=4MHz,ACLK=32768
 unsigned char i,j;   //设置系统时钟
 BCSCTL1 = 0x00;    //启动XT2晶振,ACLK为XT1(32KHz)
 BCSCTL2 = 0x88;    //MCLK为XT2不分频;SMCLK为XT2,4MHz
 j=0;
 while(1) {
  IFG1 &= ~OFIFG;   //清OSCFault标志
  for (i=0xFF;i>0;--i);  //延时等待
  if ((IFG1 & OFIFG)!=0) {
   BCSCTL1 = 0x00;  //启动XT2晶振,ACLK为XT1(32KHz)
   BCSCTL2 = 0X88;  //MCLK为XT2不分频,SMCLK为XT2不分频
   j++;   //如果检测到振荡器失效,则计数
   if (j>10)  //如果计数值超过10次,则认为是硬件问题
    ;  //OSCFault();
  }
  else {
   for (i=0xFF;i>0;--i); //等待振荡器达到足够的幅度
   IFG1 &= ~OFIFG;  //清OSCFault标志
   IE1 |= OFIE + ACCVIE; //振荡器故障,FLASH非法访问中断允许
   break;
  }
 } 
}

PARTNER CONTENT

文章评论0条评论)

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