今天下午才弄好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;
}
}
}
文章评论(0条评论)
登录后参与讨论