請(qǐng)問(wèn)CH374采用SPI方式讀寫(xiě)U盤(pán)(字節(jié)或扇區(qū)方式)參考貴公司光盤(pán)中的那個(gè)程序?
下載CH374LIB.ZIP,參考:\CH374LIB\MCS51\LIBC\EXAM1
下載CH374LIB.ZIP,根據(jù)單片機(jī)類型找到相關(guān)的文件夾.如果是51請(qǐng)參考LIBC,如果其他單片機(jī)的話,找到相應(yīng)的文件夾,查看頭文件關(guān)于編譯器的說(shuō)明就可以了.
怎么沒(méi)有AVR的普通IO模擬SPI方式讀取U盤(pán)的程序呢?
這個(gè)你參考下面的我們51下面的就可以了.只是把I/0變化的問(wèn)題.下載的SPI_SW.C里面有的.
請(qǐng)參考: /* 本例中的硬件連接方式如下(實(shí)際應(yīng)用電路可以參照修改下述定義及子程序) */ /* 單片機(jī)的引腳 CH374芯片的引腳 PINB4 SCS# PINB5 SDI PINB6 SDO PINB7 SCK */ #define CH374_SPI_SCS_SET ( PORTB = PORTB|0x10 ) /* 假定CH374的SCS引腳輸出1 該引腳為輸出狀態(tài)PB4 1*/ #define CH374_SPI_SCS_CLR ( PORTB = PORTB&0XEF ) /* 假定CH374的SCS引腳輸出0 該引腳為輸出狀態(tài)PB4*/
#define CH374_SPI_SDI ( PORTB = PINB&0x20 ) /* 假定CH374的SDI引腳 該引腳為輸入狀態(tài) 0*/
#define CH374_SPI_SDO_SET ( PORTB = PORTB|0x40) /* 假定CH374的SDO引腳輸出1 該引腳為輸出狀態(tài)*/ #define CH374_SPI_SDO_CLR ( PORTB = PORTB&0xBF) /* 假定CH374的SDO引腳輸出0 該引腳為輸出狀態(tài)*/
#define CH374_SPI_SCK_SET ( PORTB = PORTB|0X80 ) /* 假定CH374的SCK引腳輸出1 該引腳為輸出狀態(tài)1*/ #define CH374_SPI_SCK_CLR ( PORTB = PORTB&0X7F ) /* 假定CH374的SCK引腳輸出0 該引腳為輸出狀態(tài)*/
void CH374_PORT_INIT( ) /* 由于使用通用I/O模擬并口讀寫(xiě)時(shí)序,所以進(jìn)行初始化 */ { /* 如果是硬件SPI接口,那么可使用mode3(CPOL=1&CPHA=1)或mode0(CPOL=0&CPHA=0),CH374在時(shí)鐘上升沿采樣輸入,下降沿輸出,數(shù)據(jù)位是高位在前 */ CH374_SPI_SCS_SET; //CH374_SPI_SCS = 1; /* 禁止SPI片選 */ CH374_SPI_SCK_SET; //CH374_SPI_SCK = 1; /* 默認(rèn)為高電平,SPI模式3,也可以用SPI模式0,但模擬程序可能需稍做修改 */ /* 對(duì)于雙向I/O引腳模擬SPI接口,那么必須在此設(shè)置SPI_SCS,SPI_SCK,SPI_SDI為輸出方向,SPI_SDO為輸入方向 */ }
void Spi374OutByte( UINT8 d ) /* SPI輸出8個(gè)位數(shù)據(jù) */ { /* 如果是硬件SPI接口,應(yīng)該是先將數(shù)據(jù)寫(xiě)入SPI數(shù)據(jù)寄存器,然后查詢SPI狀態(tài)寄存器以等待SPI字節(jié)傳輸完成 */ UINT8 i; for ( i = 0; i < 8; i ++ ) { CH374_SPI_SCK_CLR; //CH374_SPI_SCK = 0; if ( d & 0x80 ) CH374_SPI_SDO_SET; //CH374_SPI_SDI = 1; else CH374_SPI_SDO_CLR; //CH374_SPI_SDI = 0; d <<= 1; /* 數(shù)據(jù)位是高位在前 */ CH374_SPI_SCK_SET; //CH374_SPI_SCK = 1; /* CH374在時(shí)鐘上升沿采樣輸入 */ } }
UINT8 Spi374InByte( void ) /* SPI輸入8個(gè)位數(shù)據(jù) */ { /* 如果是硬件SPI接口,應(yīng)該是先查詢SPI狀態(tài)寄存器以等待SPI字節(jié)傳輸完成,然后從SPI數(shù)據(jù)寄存器讀出數(shù)據(jù) */ UINT8 i, d; d = 0; /* 如果SPI的SDO和SDI合用一個(gè)I/O引腳,那么必須在此設(shè)置該I/O方向?yàn)檩斎?*/ for ( i = 0; i < 8; i ++ ) { CH374_SPI_SCK_CLR; // CH374_SPI_SCK = 0; /* CH374在時(shí)鐘下降沿輸出 */ d <<= 1; /* 數(shù)據(jù)位是高位在前 */ if(CH374_SPI_SDI)d ++; //if ( CH374_SPI_SDO ) d ++; CH374_SPI_SCK_SET; //CH374_SPI_SCK = 1; } return( d ); }
void Spi374Start( UINT8 addr, UINT8 cmd ) /* SPI開(kāi)始 */ { // CH374_SPI_SCS = 1; /* 對(duì)于雙向I/O引腳模擬SPI接口,那么必須確保已經(jīng)設(shè)置SPI_SCS,SPI_SCK,SPI_SDI為輸出方向,SPI_SDO為輸入方向 */ CH374_SPI_SCS_CLR; //CH374_SPI_SCS = 0; /* SPI片選有效 */ Spi374OutByte( addr ); Spi374OutByte( cmd ); }
#define Spi374Stop( ) { CH374_SPI_SCS_SET; } /* SPI結(jié)束 */ //void Spi374Stop( void ) /* SPI結(jié)束 */ //{ // CH374_SPI_SCS = 1; /* SPI片選無(wú)效 */ //}
UINT8 Read374Byte( UINT8 mAddr ) /* 從指定寄存器讀取數(shù)據(jù) */ { UINT8 d; Spi374Start( mAddr, CMD_SPI_374READ ); d = Spi374InByte( ); Spi374Stop( ); return( d ); }
void Write374Byte( UINT8 mAddr, UINT8 mData ) /* 向指定寄存器寫(xiě)入數(shù)據(jù) */ { Spi374Start( mAddr, CMD_SPI_374WRITE ); Spi374OutByte( mData ); Spi374Stop( ); }
void Read374Block( UINT8 mAddr, UINT8 mLen, PUINT8 mBuf ) /* 從指定起始地址讀出數(shù)據(jù)塊 */ { Spi374Start( mAddr, CMD_SPI_374READ ); while ( mLen -- ) *mBuf++ = Spi374InByte( ); Spi374Stop( ); }
void Write374Block( UINT8 mAddr, UINT8 mLen, PUINT8 mBuf ) /* 向指定起始地址寫(xiě)入數(shù)據(jù)塊 */ { Spi374Start( mAddr, CMD_SPI_374WRITE ); while ( mLen -- ) Spi374OutByte( *mBuf++ ); Spi374Stop( ); }
貴公司的代碼有個(gè)缺陷,使用指針時(shí),對(duì)不同單片機(jī)指向不同的存儲(chǔ)器時(shí)總是錯(cuò)誤,像在AVR中不能用code,而想指向程序存儲(chǔ)器時(shí)需要更改很多指針
我們針對(duì)51MCU KEILC下面做的例子程序,我們注重的提供的是使用方法,畢竟很多單片機(jī),更多的編譯器.我們不可能每種都能兼顧.如果代碼過(guò)多客戶也會(huì)感覺(jué)煩瑣. 如果您有需求其他代碼我們可以提供給您.
謝謝啊!我想要ATMEGA128的普通IO模擬SPI方式讀取U盤(pán)的例程.
使用ATMEGA128時(shí)應(yīng)該不用外部存儲(chǔ)器62256吧?
ding!
可以不用,128已經(jīng)有4K的SRAM了,我們的庫(kù)最少的情況下只需要600多個(gè)字節(jié)的SRAM就夠了.我們提供的是8515操作的程序,和128不一樣嗎?您只需要修改相應(yīng)的端口就可以了.
你的例程在哪里啊?我沒(méi)有看到啊 ,麻煩你告訴下,謝謝
下載CH374LIB.ZIP,根據(jù)你的編譯器選擇\CH374LIB\AVR下的庫(kù)及示例 接口子程序直接用\CH374LIB\MCS51\LIBC\EXAM1下的SPI_SW.C,但需要根據(jù)你的硬件修改硬件定義