用AVR單片機控制CH372能檢測到設(shè)備但讀取不到數(shù)據(jù)

我用51單片機控制CH372時上位機軟件能自動檢測到硬件并且讀寫數(shù)據(jù)都沒問題,接收的數(shù)據(jù)都正常,但是換為AVR單片機控制時,能檢測到硬件但是無法讀寫數(shù)據(jù),不清楚是什么原因?使用CHK_EXIST命令檢測時返回的還是寫進去的數(shù),并沒有得到取反的值,是不是讀寫函數(shù)有問題?這些操作在51單片機上都是正常的,但轉(zhuǎn)到AVR就不行了。用的AVR單片機為ATMEGA32,其底層操作部分函數(shù)如下: 其中A0接PC0,CS接PC1,WR接PC2,RD接PC3,D0~D7接PB,中斷信號采用外部中斷0的PD2口,通過中斷來進行讀寫數(shù)據(jù)操作。 //*********************************************************************** void ch372_delay_us(unsigned long count) { int i,j; for(i=0; i<20; i++) { for(j=0; j } } void CH372_PORT_INIT(void) /* 由于使用通用I/O模塊并口讀寫時序,所以進行初始化 */ { Pc_out; CH372_CS_H; CH372_WR_H; CH372_RD_H; CH372_A0_L; Pb_in; //DDRA=0x00; //for input state Pb_ff; } //*************************************** //系統(tǒng)初始化 //返回:初始化成功置1, 初始化失敗置0 //*************************************** unsigned char InitCH372Sys(void) { unsigned char InitFlag; InitFlag = CH372Init(); // 初始化CH372 CH372_PORT_INIT(); MCUCR |= b0000_1010;//下降沿觸發(fā) MCUCSR|= 0x00; GICR |= 0xC0;//b1100_0000 打開中斷1,0 sei();//開全局中 return InitFlag; }

void SendCommand372(unsigned char command) { ch372_delay_us(10); Pc_out; Pb_out; PORTB=command; CH372_A0_H; CH372_CS_L; CH372_WR_L; //在此加上ch372_delay_us(500); 也還是不行 CH372_WR_H; CH372_A0_L; ch372_delay_us(10); } void WriteData372(unsigned char *psrc, unsigned char n_byte) { unsigned char q0; Pc_out; for(q0=0; q0 { ch372_delay_us(10); Pb_out; PORTB=(*psrc); CH372_A0_L; CH372_CS_L; CH372_WR_L;//在此加上ch372_delay_us(500); 也還是不行 CH372_WR_H; CH372_CS_H; ch372_delay_us(10); psrc++; } } void ReadData372(unsigned char *pdest, unsigned char n_byte) { unsigned char q0; Pc_out; for(q0=0; q0 { ch372_delay_us(10); Pb_in; Pb_ff; CH372_A0_L; CH372_CS_L; CH372_RD_L;//在此加上ch372_delay_us(500); 也還是不行 CH372_CS_L; *pdest=PORTB; CH372_RD_H; CH372_CS_H;//CH372_A0_H; ch372_delay_us(10); pdest++; } }

看了一下你的程序,請檢查: 1:硬件連接是否正確 2:IO方向是否設(shè)置正確.你可以做一下實驗,比如循環(huán)寫入數(shù)據(jù)0X55,用示波器探測WR,CS,D0-D7,A0是否輸出正確數(shù)據(jù),電平狀態(tài)是否正確.同樣測試寫命令,讀數(shù)據(jù)函數(shù), 參考程序: /* 單片機的引腳 CH375芯片的引腳 PINB.4 INT# PORTB.3 A0 PORTB.2 CS# PORTB.1 WR# PORTB.0 RD# PORTA(8位端口) D7-D0 */

void mDelay1uS( ) /* 至少延時1uS,根據(jù)單片機主頻調(diào)整 */ { UINT8 i; for ( i = 5; i != 0; i -- ); }

void CH375_PORT_INIT( ) /* 由于使用通用I/O模塊并口讀寫時序,所以進行初始化 */ { DDRA = 0x00; /* 設(shè)置8位并口為輸入 */ PORTB = 0x07; /* 設(shè)置CS,WR,RD默認為高電平 */ DDRB = 0x0F; /* 設(shè)置CS,WR,RD,A0為輸出,設(shè)置INT#為輸入 */ }

void xWriteCH375Cmd( UINT8 mCmd ) /* 外部定義的被CH375程序庫調(diào)用的子程序,向CH375寫命令 */ { mDelay1uS( ); mDelay1uS( ); /* 至少延時1uS */ /* *(volatile unsigned char *)CH375_CMD_PORT_ADDR = mCmd; 通過并口直接讀寫CH375而非普通I/O模擬 */ PORTB |= 0x08; /* 輸出A0=1 */ PORTA = mCmd; /* 向CH375的并口輸出數(shù)據(jù) */ DDRA = 0xFF; /* 并口D0-D7輸出 */ PORTB &= 0xF9; /* 輸出有效寫控制信號, 寫CH375芯片的命令端口, A0=1; CS=0; WR=0; RD=1; */ DDRA = 0xFF; /* 該操作無意義,僅作延時,CH375要求讀寫脈沖寬度大于100nS */ PORTB |= 0x07; /* 輸出無效的控制信號, 完成操作CH375芯片, A0=1; CS=1; WR=1; RD=1; */ DDRA = 0x00; /* 禁止數(shù)據(jù)輸出 */ PORTB &= 0xF7; /* 輸出A0=0; 可選操作 */ mDelay1uS( ); mDelay1uS( ); /* 至少延時2uS */ }

void xWriteCH375Data( UINT8 mData ) /* 外部定義的被CH375程序庫調(diào)用的子程序,向CH375寫數(shù)據(jù) */ { /* *(volatile unsigned char *)CH375_DAT_PORT_ADDR = mData; 通過并口直接讀寫CH375而非普通I/O模擬 */ PORTA = mData; /* 向CH375的并口輸出數(shù)據(jù) */ DDRA = 0xFF; /* 并口D0-D7輸出 */ PORTB &= 0xF1; /* 輸出有效寫控制信號, 寫CH375芯片的數(shù)據(jù)端口, A0=0; CS=0; WR=0; RD=1; */ DDRA = 0xFF; /* 該操作無意義,僅作延時,CH375要求讀寫脈沖寬度大于100nS */ PORTB |= 0x07; /* 輸出無效的控制信號, 完成操作CH375芯片, A0=0; CS=1; WR=1; RD=1; */ DDRA = 0x00; /* 禁止數(shù)據(jù)輸出 */ mDelay1uS( ); /* 至少延時1.2uS */ }

UINT8 xReadCH375Data( void ) /* 外部定義的被CH375程序庫調(diào)用的子程序,從CH375讀數(shù)據(jù) */ { UINT8 mData; /* mData = *(volatile unsigned char *)CH375_DAT_PORT_ADDR; 通過并口直接讀寫CH375而非普通I/O模擬 */ mDelay1uS( ); /* 至少延時1.2uS */ DDRA = 0x00; /* 數(shù)據(jù)輸入 */ PORTB &= 0xF2; /* 輸出有效讀控制信號, 讀CH375芯片的數(shù)據(jù)端口, A0=0; CS=0; WR=1; RD=0; */ DDRA = 0x00; /* 該操作無意義,僅作延時,CH375要求讀寫脈沖寬度大于100nS */ mData = PINA; /* 從CH375的并口PA輸入數(shù)據(jù) */ PORTB |= 0x07; /* 輸出無效的控制信號, 完成操作CH375芯片, A0=0; CS=1; WR=1; RD=1; */ return( mData ); }


看了樓上的例子,有一個函數(shù)比較疑惑: UINT8 xReadCH375Data( void ) /* 外部定義的被CH375程序庫調(diào)用的子程序,從CH375讀數(shù)據(jù) */ { UINT8 mData; /* mData = *(volatile unsigned char *)CH375_DAT_PORT_ADDR; 通過并口直接讀寫CH375而非普通I/O模擬 */ mDelay1uS( ); /* 至少延時1.2uS */ DDRA = 0x00; /* 數(shù)據(jù)輸入 */ PORTB &= 0xF2; /* 輸出有效讀控制信號, 讀CH375芯片的數(shù)據(jù)端口, A0=0; CS=0; WR=1; RD=0; */ DDRA = 0x00; /* 該操作無意義,僅作延時,CH375要求讀寫脈沖寬度大于100nS */ mData = PINA; /* 從CH375的并口PA輸入數(shù)據(jù) */ PORTB |= 0x07; /* 輸出無效的控制信號, 完成操作CH375芯片, A0=0; CS=1; WR=1; RD=1; */ return( mData ); } 在讀取數(shù)據(jù)時的PINA應(yīng)該用PORTA吧?


不是的,PINA是輸入寄存器,PORTB是輸出寄存器,讀數(shù)據(jù)肯定是輸入寄存器


只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频