我用ATmageAVR4.4 編寫的代碼: (1)ch375b初始化不成功? (2)用什么pc軟件向ch375寫數(shù)據(jù)? (3)用bus hound檢測發(fā)送的數(shù)據(jù)行嗎? 謝謝,各位大師了
#include "pctoch375.h" #include #include "pctoch375ExtINT.h" #include "CH375INC.H"
#define A0 PD5 //定義引腳 #define RD PG1 #define WR PG0 #define CS PD7 #define NOP asm("nop") //定義一個空操作語句
///////////////////////////////////////////////////////////////////////////// //pctoch375
static void io_init(void) { //{{WIZARD_MAP(General) //}}WIZARD_MAP(General)
//{{WIZARD_MAP(I/O Ports) // PortA PORTA = 0x0; DDRA = 0xFF; // PortB PORTB = 0x0; DDRB = 0x0; // PortC PORTC = 0x0; DDRC = 0x0; // PortD PORTD = 0x80; DDRD = 0x80; // PortE PORTE = 0x0; DDRE = 0x0; // PortF PORTF = 0x0; DDRF = 0x0; // PortG PORTG = 0x03; DDRG = 0x0F; //}}WIZARD_MAP(I/O Ports)
//{{WIZARD_MAP(Watchdog) // Watchdog Disabled wdt_disable(); //}}WIZARD_MAP(Watchdog)
//{{WIZARD_MAP(Analog Comparator) // Analog Comparator Disabled ACSR = 0x80; //}}WIZARD_MAP(Analog Comparator) }
/* 延時1微秒*/ void mDelay1uS(void) { char i; for ( i = 10; i != 0; i -- ); }
void mDelay40mS(void) { char i,j; for ( i = 400; i != 0; i-- ) for ( j = 1000; j != 0; j-- ); }
/******************************************* 向CH375寫數(shù)據(jù)函數(shù) ********************************************/ void WR_DAT_ch375(unsigned char dat) { cbi(PORTD,PD7); cbi(PORTD,PD5); //A0 = Low 選擇輸出是數(shù)據(jù) cbi(PORTG,PG0); //WR = Low 選擇寫 DDRA = 0xFF; //將PORTA置成輸出 NOP; NOP; outp(dat,PORTA); mDelay1uS( ); mDelay1uS( ); }
/******************************************* 寫命令函數(shù) ********************************************/ void WR_CMD_ch375(unsigned char cmd) { cbi(PORTD,PD7); cbi(PORTG,PG0); //WR = Low 選擇寫 sbi(PORTD,PD5); //A0 = High 寫命令 DDRA = 0xFF; //將PORTA置成輸出 NOP; NOP; //兩個空操作 outp(cmd,PORTA); mDelay1uS( ); mDelay1uS( ); }
/******************************************* 讀CH375數(shù)據(jù)函數(shù) ********************************************/ unsigned char RD_data_ch375(void) { unsigned char data; cbi(PORTD,PD7); sbi(PORTD,PD5); cbi(PORTG,PG1); //RD = Low 選擇讀 cbi(PORTD,PD5); //A0 = Low 選擇輸出是數(shù)據(jù) DDRA = 0x00; NOP; NOP; data = inp(PINA); //讀端口數(shù)據(jù)并返回 return data; }
/* CH375初始化子程序 */ void CH375_Init(void) { unsigned char i; /* 測試CH375是否正常工作,可選操作,通常不需要 */ cbi(PORTD,PD7); WR_CMD_ch375( CMD_RESET_ALL ); mDelay40mS(); WR_CMD_ch375( CMD_CHECK_EXIST ); /* 測試CH375是否正常工作 */ WR_DAT_ch375( 0x55 ); /* 寫入測試數(shù)據(jù) */ i = ~(0x55); /* 返回數(shù)據(jù)應該是測試數(shù)據(jù)取反 */ if ( RD_data_ch375( ) != i ) /* CH375不正常 */ { sbi(PORTG,PG3); /*測試信號*/ for ( i=80; i!=0; i-- ) { WR_CMD_ch375( CMD_RESET_ALL ); /* 多次重復發(fā)命令,執(zhí)行硬件復位 */ RD_data_ch375( ); } WR_CMD_ch375(0); mDelay40mS(); } else sbi(PORTG,PG4); /*測試信號*/ WR_CMD_ch375( CMD_SET_USB_MODE );/* 設(shè)置USB工作模式, 必要操作 */ WR_DAT_ch375( 2 ); /* 設(shè)置為使用內(nèi)置固件的USB設(shè)備方式 */ for ( i=100; i!=0; i-- ) { /* 等待操作成功,通常需要等待10uS-20uS */ if ( RD_data_ch375( ) == CMD_RET_SUCCESS ) break; } }
/* CH375中斷服務程序*/ void Interrupt375(void) { unsigned char InterruptStatus; unsigned char i,length; unsigned char data_buffer[ 64 ]; WR_CMD_ch375( CMD_GET_STATUS ); /* 獲取中斷狀態(tài)并取消中斷請求 */ InterruptStatus=RD_data_ch375( ); /* 獲取中斷狀態(tài) */ sbi(PORTG,PG2); /*測試信號正常*/ switch (InterruptStatus) { /* 分析中斷狀態(tài)處理 */ case USB_INT_EP2_OUT: { /* 批量端點下傳成功 */ WR_CMD_ch375( CMD_RD_USB_DATA ); /* 從當前USB中斷的端點緩沖區(qū)讀取數(shù)據(jù)塊,并釋放緩沖區(qū) */ length=RD_data_ch375( ); /* 首先讀取后續(xù)數(shù)據(jù)長度 */ for ( i=0; i data_buffer[ i ]=RD_data_ch375( ); /* 接收數(shù)據(jù)包 */ /* 測試數(shù)據(jù)正確性,將接收到的命令包數(shù)據(jù)取反后返回給PC機 */ WR_CMD_ch375(CMD_WR_USB_DATA7); /* 向USB端點2的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊 */ WR_DAT_ch375(length); /* 首先寫入后續(xù)數(shù)據(jù)長度,回傳剛接收到的數(shù)據(jù)長度 */ for ( i=0; i WR_DAT_ch375( ~data_buffer[ i ] ); /* 數(shù)據(jù)取反后返回,由計算機應用程序測試數(shù)據(jù)是否正確 */ break; } case USB_INT_EP2_IN: { /* 批量數(shù)據(jù)發(fā)送成功 */ WR_CMD_ch375( CMD_UNLOCK_USB ); /* 釋放當前USB緩沖區(qū) */ break; } default: { /* 其它中斷,未用到,解鎖后退出即可 */ WR_CMD_ch375( CMD_UNLOCK_USB ); /* 釋放當前USB緩沖區(qū) */ break; } } }
int main(void) { //{{WIZARD_MAP(Initialization) io_init(); extint_init(); //}}WIZARD_MAP(Initialization) // TODO: Add extra initialization here //{{WIZARD_MAP(Global interrupt) //sei(); //}}WIZARD_MAP(Global interrupt) CH375_Init( ); /* 初始化CH375 */ sei(); /* 允許中斷 */ while ( 1 ); /* 以下指令開始工作循環(huán),等待PC機命令進行操作 */ { // TODO: Add your code here if(flag==1) //中斷flag標志 { Interrupt375(); flag=0; } } } [b]文字[/b]
sbi(PORTG,PG3)-------------是看程序進程的,初始化始終不成功,求救