|
|||||||||||
| 技術交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術 | 電源技術 | 測控之家 | EMC技術 | ARM技術 | EDA技術 | PCB技術 | 嵌入式系統(tǒng) 驅動編程 | 集成電路 | 器件替換 | 模擬技術 | 新手園地 | 單 片 機 | DSP技術 | MCU技術 | IC 設計 | IC 產業(yè) | CAN-bus/DeviceNe |
硬件SPI的操作疑問. |
| 作者:coke 欄目:單片機 |
有沒有哪位用過C8051F31X的MCU. 我用硬件SPI時候遇到一個問題就是收不到數(shù)據. 用數(shù)字示波器觀測到MISO的引腳有數(shù)據. 與MOSI的數(shù)據輸出是同步. SPI工作在4線主模式查詢模式. 可以正確發(fā)送數(shù)據給對方.在MISO也能看到收到的規(guī)定數(shù)據.但SPI0DAT就是0X00.是哪里的問題.下面是簡化出來的SPI主模式測試程序. #include"c8051F310.h" #include<intrins.h> typedef unsigned CHAR BOOL; // Data typedef unsigned CHAR BYTE; typedef unsigned SHORT WORD; typedef unsigned LONG DWORD; // Unsigned numbers typedef unsigned CHAR UINT8; typedef unsigned SHORT UINT16; typedef unsigned LONG UINT32; // Signed numbers typedef signed CHAR INT8; typedef signed SHORT INT16; typedef signed LONG INT32; #define SPI_ENABLE() (SPI0CN |= 0X01) #define LOW 0 #define HIGH 1 #define CCxxx0_SRX 0x34 #define CCxxx0_STX 0x35 // where freq is one of: #define SCLK_6_MHZ 1 #define SCLK_4_MHZ 2 #define SCLK_3_MHZ 3 #define SCLK_2_4_MHZ 4 #define SCLK_2_MHZ 5 #define SCLK_1_5_MHZ 7 #define SCLK_1_2_MHZ 9 #define SCLK_1_MHZ 11 #define SPI_INIT(freq) \ do { \ SPI0CFG = 0x40; \ SPI0CN = 0x08; \ SPI0CKR = freq; \ SPI_ENABLE(); \ } while (0) #define DIS_watchdog()\ do{PCA0MD &= ~0x40;\ }while(0) #define halSpiStrobe(strobe)\ do {\ NSSMD0 = 0;\ while (P_SO);\ SPI0DAT = strobe;\ while(SPIF);\ SPIF=0;\ NSSMD0 = 1;\ } while (0) /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ I/O PORTS //-----------------------------------------------------------------*/ // PORT 0 sbit P_SCLK =P0^0; //OUTPUT sbit P_SO =P0^1; //input sbit P_UART_TD =P0^4; //OUTPUT sbit P_UART_RD =P0^5; //input sbit P_SI =P0^6; //OUTPUT sbit P_NSSMD0 =P0^7; //OUTPUT // PORT 1 sbit P_SDA =P1^0; //input|OUTPUT sbit P_SCL =P1^1; //OUTPUT sbit P_SYSCLK =P1^2; //OUTPUT sbit P_BUTTON_PUSH =P1^3; //input sbit P_FSYN =P1^4; //OUTPUT sbit P_BCLK =P1^5; //OUTPUT sbit P_GDO2 =P1^6; //nc sbit P_GDO0 =P1^7; //input // PORT 2 sbit P_SPCLK =P2^0; //OUTPUT sbit P_SPTR =P2^1; //OUTPUT|input sbit P_SPEN =P2^2; //OUTPUT sbit P_LED =P2^3; //OUTPUT sbit P_DR =P2^4; //OUTPUT sbit P_DT =P2^5; //input void IO_PORT_INIT() { P0SKIP = 0x0C; //xtal1.xtal2 XBR0 = 0x0F; //SYSCLK,SMBUS, SPI, UART be connected to I/O. XBR1 = 0x40; P0MDIN &= 0XF9; P0MDOUT = 0XF1; P1MDOUT = 0x74; P2MDOUT = 0xdf; //be used tested } //====================================================================================================== void CLOCK_INIT(void) { UINT8 i; OSCXCN = 0x67; // external CRYSTAL for (i = 0; i < 200; i++); // Wait 1ms for initialization while ((OSCXCN & 0x80) == 0); // Check the state of external OSCI CLKSEL = 0x01; // SYSCLK <--External CRYSTAL OSCICN = 0x00; // Internal OSCI stop } BYTE spiGetTxStatus(void) { UINT8 TEMP; NSSMD0 = LOW; while (P_SO); SPI0DAT = 0x3d; while(!SPIF); //等待標志 SPIF=0;   |
| 2樓: | >>參與討論 |
| 作者: sclarkca 于 2005/11/26 21:25:00 發(fā)布:
我也有同樣的問題 我用8051F040沒什么問題,但是8051F330就不行了,不知道為什么! |
|
| 3樓: | >>參與討論 |
| 作者: sclarkca 于 2005/11/29 11:58:00 發(fā)布:
怎么沒有高人指點呀? 樓主搞定了嗎?:) |
|
| 4樓: | >>參與討論 |
| 作者: isoar 于 2005/11/29 12:30:00 發(fā)布:
硬件SPI的用過,不過你的MCU太高級沒用過 |
|
| 5樓: | >>參與討論 |
| 作者: sclarkca 于 2005/12/6 16:02:00 發(fā)布:
頂起來 樓主和各位大蝦指點一下了:) |
|
| 6樓: | >>參與討論 |
| 作者: lrzxc 于 2005/12/6 17:39:00 發(fā)布:
xhl的配套光盤上有ATMEL spi FLASH的例子 |
|
| 7樓: | >>參與討論 |
| 作者: coke 于 2005/12/6 18:30:00 發(fā)布:
搞定 P0MDIN &= 0XF9; 改成 P0MDIN &= 0XF3;即可 不小心將P0.1設為模擬引腳. |
|
|
|
| 免費注冊為維庫電子開發(fā)網會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |