我使用GPIO控制,成功,现在想用XINTF总线控制,使用数据线D0~07连接CH375的D0~D7.使用XNMI,连接CH375中断,使用XZCS0AND1,作为CH375片选,XWE连接CH375的WR#,XRD连接CH375的RD#,A0由一个IO口控制,但是,始终没有办法初始化成功,测试通不过,程序如下:#include "DSP281x_Device.h" // DSP281x Headerfile Include File #include "DSP281x_Examples.h" // DSP281x Examples Include File #include "DSP281x_Gpio.h" #include "CH375INC.H"
#define CH375_A0 GpioDataRegs.GPADAT.bit.GPIOA9
#define USBDevice 0x02 #define USBBuffer_MaxLen 64 extern unsigned char USBBuffer[64]; //USB接收数据缓冲区 extern unsigned char USBRecFlag; //USB unsigned char USBData_Len=0; //USB数据包长度 extern unsigned int * TFT_ADD1; /****************************************************/ //函数描述: 短延迟 //写入参数: Delaynum,延迟时间:不详 //返回参数: 无 //描述: 延时 /****************************************************/ void SDelay(unsigned int DelayNum) { while(DelayNum--); } /****************************************************/ //函数描述:CH375处于无效状态 //写入参数:无 //返回参数:无 //描述: 读、写无效 /****************************************************/ void CH375Disable() { //add // CH375_A0=0; // * TFT_ADD1=0x00; // CH375_CS=0; // CH375_Read=1; // CH375_Write=1;
} /****************************************************/ //函数描述:CH375初始化 //写入参数:无 //返回参数:无 //描述: 初始化顺序:硬件复位,自测试(循环),写模式,开中断 /****************************************************/ void CH375Ini() { unsigned char i; // CH375Disable(); //CH375无效 CH375_WriteCmd(CMD_RESET_ALL) ; //写入复位命令 for(i=0;i<150;i++) { SDelay(4500); //延时>30MS } while(!CH375SelfTest()) //测试CH375 { } CH375Write_Mode(USBDevice); //设置USB驱动模式,为设备模式(0x02)
} /****************************************************/ //函数描述:CH375自动检测 //写入参数:无 //返回参数:无 //描述: // 测试数据: 0XAA, // 返回数值:0 自测试失败 // 1 自测试成功 /****************************************************/ unsigned char CH375SelfTest() { unsigned char DataTest; CH375_WriteCmd(CMD_CHECK_EXIST); //写入测试命令 SDelay(2000); //延时 CH375_WriteData(0xAA); //写入测试数据 DataTest=CH375_ReadData(); //读出测试返回数据 if(DataTest == 0x55) //判断测试返回数据, { return 1; } else { return 0; } } /****************************************************/ //函数描述:CH375写命令函数 //写入参数:命令控制字 //返回参数:无 //描述: /****************************************************/ void CH375_WriteCmd(unsigned char CH375Command) {
CH375_A0 = 1; //A0为1的时候,写入命令,A0为0的时候,写入数据 * TFT_ADD1=CH375Command & 0xFF; * TFT_ADD1=CH375Command & 0xFF; * TFT_ADD1=CH375Command & 0xFF; SDelay(2000);
} /****************************************************/ //函数描述:CH375写数据 //写入参数:数据 //返回参数:无 //描述: // 2009.07.27 : V2.0: 从子程序中去除CH375Disable(),在连续写数据过程中不能将CS变高,移到写完整个数据块后在Disable /****************************************************/ void CH375_WriteData(unsigned char CH375Data) {
CH375_A0 = 0; //A0为1的时候,写入命令,A0为0的时候,写入数据 * TFT_ADD1=CH375Data & 0x00FF; * TFT_ADD1=CH375Data & 0x00FF; * TFT_ADD1=CH375Data & 0x00FF; SDelay(2000);
} /****************************************************/ //函数描述:CH375读数据 //写入参数:无 //返回参数:读出数据 //描述: //2009.07.27 , V2.0 :在子程序中去出了CH375Disable()函数 // 原因:在批量数据读取时,CS线不能变低。将这部分功能移动到了数据读取完后再进行Disable /****************************************************/ unsigned char CH375_ReadData() { unsigned char USBData;
CH375_A0 = 0; //A0为1的时候,读出中断标志,A0为0的时候,读出数据 USBData = * TFT_ADD1 & 0x00FF; USBData = * TFT_ADD1 & 0x00FF; USBData = * TFT_ADD1 & 0x00FF; SDelay(2000);
return USBData; } /****************************************************/ //函数描述:CH375写模式 //写入参数:模式数据 //返回参数:无 //描述: // 写完命令自测试 /****************************************************/ void CH375Write_Mode(unsigned char CH375Mode) { //add CH375_WriteCmd(CMD_SET_USB_MODE); SDelay(20); CH375_WriteData(CH375Mode); while(CH375_ReadData()!=CMD_RET_SUCCESS) { } //UartTrans("USB Set Mode OK!\n",17); CH375Disable(); } /****************************************************/ //函数描述:CH375缓冲区复位 //写入参数:无 //返回参数:无 //描述: // 长度清零、缓冲区清零 /****************************************************/ void USBReset() { unsigned char Count_Temp; for(Count_Temp=0;Count_Temp { USBBuffer[Count_Temp]=0xAF; } USBData_Len = 0; } /****************************************************/ //函数描述:CH375发送数据 //写入参数:数据以及数据包的长度 //返回参数:无 //描述: // /****************************************************/ void USBSend_Data(unsigned char *USBSendBuffer,unsigned char SendBuffer_Len) { //add unsigned char Count_Temp; CH375_WriteCmd(CMD_WR_USB_DATA7); //向CH375的端点输出缓冲区或者端点2的上传缓冲区写入数据块 CH375_WriteData(SendBuffer_Len); //向CH375写入数据块长度 for(Count_Temp=0;Count_Temp { CH375_WriteData(*(USBSendBuffer+Count_Temp)); //写入数据 } CH375Disable(); } /****************************************************/ //函数描述:CH375中断 //写入参数:无 //返回参数:无 //描述: // 中断源:INT0 // 缓冲区:USBBuffer[] // 长度 :USBData_Len ,Maxlen=64 /****************************************************/ void USBint() {
unsigned char USBStatus; unsigned char Count_Temp; SDelay(200); CH375_WriteCmd(CMD_GET_STATUS); //发送得到CH375状态的命令 SDelay(200); USBStatus=CH375_ReadData(); //读出CH375中断命令 switch(USBStatus) { case USB_INT_EP1_OUT: /* USB端点1的OUT */ {
} break;
case USB_INT_EP1_IN: /* USB端点1的IN */ CH375_WriteCmd(CMD_UNLOCK_USB); break;
case USB_INT_EP2_OUT: /* USB端点2的OUT */ { CH375_WriteCmd(CMD_RD_USB_DATA); //从当前USB中断的端点缓冲区中读取数据块 USBData_Len=CH375_ReadData(); //读取接收长度 if(USBData_Len>64) { USBData_Len=64; } for(Count_Temp=0;Count_Temp< USBData_Len;Count_Temp++) //接收数据块 { USBBuffer[Count_Temp]=CH375_ReadData(); } USBRecFlag=1; CH375Disable(); } break;
case USB_INT_EP2_IN: /* USB端点2的IN */ CH375_WriteCmd(CMD_UNLOCK_USB); break;
case USB_INT_USB_SUSPEND: break;
case USB_INT_WAKE_UP: break;
default: break; } } 还请各位大侠给予指导!谢谢!