用软件模拟SPI,一直调试不通,请各位高手指正程序错误,主要是还是感觉时序有点问题.但是一直基本上都是对的.还请那位仁兄指正程序错误,<br />!!!!!!!!!!抱歉耽误5.1休息时间<br />调了2天了.还是没调出来.<br />感谢走过 ,路过,留言的人..<br /><br /><br /><br />#define R0 0 <br />#define R1 1 <br />#define R1b 2 <br />#define R2 3 <br />#define R3 4 <br />#include "44b.h"<br />#include "Uart.h"<br />#include "44blib.h"<br />#include "DEF.h"<br />uint32 looptime; <br />uint8 rep[5]; <br /><br /><br /><br />#define nop() do{;}while(0); <br /><br />#define CS_PIN 0 //CS GPF0<br />#define DI_PIN 7 //GPF5<br /><br />#define SD_CS_PORT rPDATF<br />#define SD_CS_DDR_PORT rPCONF <br />#define SD_CS_PUP_PORT rPUPF <br /><br />#define SD_DI_PORT rPDATF<br />#define SD_DI_DDR_PORT rPCONF <br />#define SD_DI_PUP_PORT rPUPF <br /><br /><br />#define DO_PIN 5 //EN GPF7 <br />#define CLK_PIN 8 //RS GPF8<br /><br />#define SD_DO_PORT rPDATF <br />#define SD_DO_DDR_PORT rPCONF <br />#define SD_DO_PUP_PORT rPUPF<br /><br />#define SD_CLK_PORT rPDATF <br />#define SD_CLK_DDR_PORT rPCONF <br />#define SD_CLK_PUP_PORT rPUPF <br /><br />#define CS_LOW() SD_CS_PORT &= ~(1<< CS_PIN) <br />#define CS_HIGH() SD_CS_PORT |= (1<< CS_PIN) <br />#define DI_LOW() SD_DI_PORT &= ~(1<< DI_PIN) <br />#define DI_HIGH() SD_DI_PORT |= (1<< DI_PIN) <br />#define CLK_LOW() SD_CLK_PORT &= ~(1<< CLK_PIN) <br />#define CLK_HIGH() SD_CLK_PORT |= (1<< CLK_PIN) <br />#define DO() SD_DO_PORT & 0xff<br />#define _400KHZ_ 128 <br />#define _10MHZ_ 1 <br /><br />//----------------------------------------------------------- <br />//延时 <br /> void loop(uint32 i) <br />//----------------------------------------------------------- <br />{ <br /> while (i--) <br /> { <br /> ;//nop(); <br /> } <br />} <br /> <br />//----------------------------------------------------------- <br />//发送一字节数据 <br /> void SPI_send(uint8 cmd) <br />//----------------------------------------------------------- <br />{ <br /> uint8 i; <br /> uint8 MASK[] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; <br /><br /> for (i = 0; i < 8; i++) <br /> { <br /> CLK_LOW(); <br /><br /> if (cmd & MASK) <br /> DI_HIGH(); <br /> else <br /> DI_LOW(); <br /><br /> loop(looptime); <br /><br /> CLK_HIGH(); <br /> loop(looptime);<br /> } <br />} <br /><br />//----------------------------------------------------------- <br />//接收一字节数据 <br />uint8 SPI_receive(void) <br />//----------------------------------------------------------- <br />{ <br /> uint8 i; <br /> uint8 ret = 0; <br /> uint8 MASK[] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; <br /><br /> for (i = 0; i < 8; i++) <br /> { <br /> CLK_LOW(); <br /><br /> loop(looptime); <br /><br /> if (DO()) <br /> ret |= MASK; <br /><br /> CLK_HIGH(); <br /> loop(looptime); <br /> } <br /> return ret; <br />} <br /><br />//----------------------------------------------------------- <br />//发送命令 <br /> uint8 SendCommand(uint8 cmd, uint32 arg, uint8 ACK) <br />//----------------------------------------------------------- <br />{ <br /> uint8 status; <br /> uint8 i; <br /> uint8 len; <br /> CS_HIGH();<br /> loop(74);<br /> CS_LOW();<br /><br /> SPI_send(cmd|0x40); <br /> SPI_send(arg>>24); <br /> SPI_send(arg>>16); <br /> SPI_send(arg>>8); <br /> SPI_send(arg); <br /> SPI_send(0x95); <br /> <br /> switch (ACK) <br /> { <br /> case R0: <br /> return 1; <br /> case R1: <br /> len=1; <br /> break; <br /> case R2: <br /> len=2; <br /> break; <br /> case R3: <br /> len=5; <br /> break; <br /> default: <br /> return 0; <br /> break; <br /> } <br /><br /> for (i = 0; i < 100; i++) <br /> { <br /> status = SPI_receive(); <br /> if (!(status & 0x80)) <br /> break; <br /> } <br /><br /> if (i >= 100) <br /> { <br /> SPI_send(0xff); <br /> return 0; <br /> } <br /><br /> rep[0] = status; <br /><br /> for (i = 1; i < len; i++) <br /> { <br /> rep = SPI_receive(); <br /> } <br /><br /> SPI_send(0xff); <br /><br /> return 1; <br />} <br /><br />//----------------------------------------------------------- <br /> void Reset(void) <br />//----------------------------------------------------------- <br />{ <br /> CS_LOW(); <br /><br /> SendCommand(0x00,0x00,R0); <br /><br /> CS_HIGH(); <br />} <br /><br />//----------------------------------------------------------- <br />uint32 IsSD(void) <br />//----------------------------------------------------------- <br />{ <br /> uint32 i; <br /><br /> CS_LOW(); <br /><br /> for (i = 0; i < 1000; i++) <br /> { <br /> SendCommand(55,0x0000,R1); <br /><br /> SendCommand(41,0x0000,R1); <br /><br /> if (!rep[0]) <br /> break; <br /><br /> loop(200); <br /> } <br /><br /> CS_HIGH(); <br /><br /> return i != 100; <br />} <br /><br />//----------------------------------------------------------- <br />uint32 IsMMC(void) <br />//----------------------------------------------------------- <br />{ <br /> uint32 i; <br /><br /> CS_LOW(); <br /><br /> for (i = 0; i < 1000; i++) <br /> { <br /> SendCommand(1, 0x0000, R1); <br /><br /> if (!rep[0]) <br /> break; <br /><br /> loop(200); <br /> } <br /><br /> CS_HIGH(); <br /><br /> return i != 100; <br />} <br /><br />//----------------------------------------------------------- <br />int SD_erase(uint32 sector,uint8 *buff) <br />//----------------------------------------------------------- <br />{ <br /> CS_LOW(); <br /><br /> if (!SendCommand(32,sector<<9,R1)||!SendCommand(33,sector<<9,R1)||!SendCommand(38,0x0000,R1)) <br /> { <br /> CS_HIGH(); <br /><br /> return 0; <br /> } <br /><br /> while (!DO()) <br /> SPI_send(0xff); <br /><br /> CS_HIGH(); <br /> <br /> return 1; <br />} <br /><br />uint32 SD_read(uint32 sector,uint8 *buff) <br />{ <br /> uint32 i; <br /><br /> CS_LOW(); <br /><br /> if (!SendCommand(17,sector<<9,R1)) <br /> { <br /> CS_HIGH(); <br /> Uart_Printf("readerr1"); <br /> return 0; <br /> } <br /><br /> for (i = 0; i < 100; i++) <br /> { <br /> if (SPI_receive() == 0xfe) <br /> break; <br /> } <br /><br /> if (i >= 100) <br /> { <br /> CS_HIGH(); <br /> Uart_Printf("readerr2"); <br /> return 0; <br /> } <br /><br /> for (i = 0; i < 512; i++) <br /> { <br /> *buff++ = SPI_receive(); <br /> } <br /><br /> SPI_receive(); <br /> SPI_receive(); <br /><br /> SPI_send(0xff); <br /><br /> CS_HIGH(); <br /> <br /> Uart_Printf("readOK"); <br /><br /> return 1; <br />} <br /><br />uint32 SD_write(uint32 sector,uint8 *buff) <br />{ <br /> uint32 i; <br /><br /> CS_LOW(); <br /><br /> SendCommand(24,sector<<9,R1); <br /><br /> SPI_send(0xfe); <br /><br /> for (i = 0; i < 512; i++) <br /> SPI_send(buff); <br /><br /> SPI_send(0xff); <br /> SPI_send(0xff); <br /> <br /> for (i = 0; i < 100; i++) <br /> { <br /> rep[0] = SPI_receive(); <br /> if (!rep[0]) <br /> break; <br /> } <br /> if (i >= 100) <br /> { <br /> Uart_Printf("writeerr1"); <br /> return 0; <br /> } <br /><br /> while (!DO()) <br /> SPI_send(0xff); <br /><br /> CS_HIGH(); <br /> <br /> Uart_Printf("writeOK"); <br />//下面其实是复位 <br /> looptime =_400KHZ_; <br /> <br /> SPI_send(0xff); <br /> SPI_send(0xff); <br /> SPI_send(0xff); <br /> SPI_send(0xff); <br /> SPI_send(0xff); <br /> SPI_send(0xff); <br /> SPI_send(0xff); <br /> SPI_send(0xff); <br /> SPI_send(0xff); <br /> SPI_send(0xff); <br /> <br /> IsSD(); <br /> <br /> looptime=_10MHZ_; <br />//完 <br /> return 1; <br />} <br /><br />void SD_install(void) <br />{ <br /> looptime =_400KHZ_; <br /> <br /> SPI_send(0xff); <br /> SPI_send(0xff); <br /> SPI_send(0xff); <br /> SPI_send(0xff); <br /> SPI_send(0xff); <br /> SPI_send(0xff); <br /> SPI_send(0xff); <br /> SPI_send(0xff); <br /> SPI_send(0xff); <br /> SPI_send(0xff); <br /><br /> Reset(); <br /><br /> if (!IsSD()&&!IsMMC()) <br /> { <br /> Uart_Printf("unknown card type!
"); <br /> return; <br /> } <br /> Uart_Printf("SD/MMC card found!
Now loading SD/MMC driver......
"); <br /> looptime=_10MHZ_; <br />} <br /><br />void SD_init(void) <br />{ rPCONF=0x082555;//PF8 :CLK,OUTPUT;PF7:DATAIN,INPUT;PF5:DATAOUT,OUTPUT;PF0,OUTPUT,CS<br /> SD_install(); <br />} <br /> |
|