![]() |
|
Tài trợ cho PIC Vietnam |
Giao tiếp USB, CAN, I2C, SPI, USART... Những giao tiếp được tích hợp trên PIC |
![]() |
|
Ðiều Chỉnh | Xếp Bài |
![]() |
#16 |
Đệ tử 5 túi
|
cái này tui nghĩ nó có thể thay thế com ROM rất ok , 1 mạch thu thập dữ liệu , lưu vào đó , sau 1 thời gian , lấy thẻ ra , cắm vào máy tính hay DTDD , rồi đọc dữ liệu đó , hình ảnh , hay âm thanh , hay biểu đồ , có lẽ vậy là ứng dụng dc vài thế mạnh của nó ... , còn ai siêu thì lưu mp3 vô hát ( mắc hơn đi mua máy mp3)
còn tạo ra 3.3v , thì chỉ cần 1 con zenner 3.3v , hé hé , cái này học trc khi học BJT
__________________
Mạch - remote điều khiển từ xa qua RF 30m ,300m ,500m,1000m,... (đã test ) ,loại công suất lớn , loại cực nhỏ .... , rẻ ,giao hàng nhanh chóng toàn quốc (3 ngày), thâm niên 3 năm mua bán mạch RF 09 8485.bảy bảy.11 bán linh kiện ,MCU ARM , kit , dụng cụ , mạch www.nhattaoonline.com Hỗ trợ kỹ thuật đầy đủ. Tài liệu đầy đủ. |
![]() |
![]() |
![]() |
#17 |
Đệ tử 1 túi
Tham gia ngày: Mar 2007
Bài gửi: 24
: |
Ổn áp 3V3 cho MMC card nên dùng con BA033T cho ổn định, nếu dùng zenner ghim áp lỡ "giữa đường đứt gánh" thì toi cái thẻ!!
|
![]() |
![]() |
![]() |
#18 |
Nhập môn đệ tử
Tham gia ngày: Sep 2008
Bài gửi: 10
: |
Code:
#include<16f877a.h> #include<def_877a.h> // Speihersutz121345=aus,Debug11=aus,ProgrammFlash9=an,EEpromRead8=an,NiendervoltProgr7=aus // NiederVoltReset6=an,EinschaltTimer3=an,WachDogTimer2=aus,Oszilator01=XC #fuses HS,NOWDT,NOPROTECT,NOLVP #use delay(clock=4000000) #use rs232 (baud=4800 , parity = N , xmit=pin_C6 , rcv=pin_C7 ) #bit CS = PORTC.2 //Ausgang für Chip Select #bit SCK = PORTC.3 //Ausgang Clock #bit SDO = PORTC.5 //Ausgang Daten Output #bit SDI = PORTC.4 //Eingang Daten Input #byte temp = 0x31 #bit temp_7 = temp.7 #byte temp1 = 0x32 #bit temp1_0 = temp1.0 #define bls 20 int mmc_init(); int mmc_response(unsigned char response); int mmc_read_block(int32 add,int result); int1 mmc_write_block(int32 add,int tem); int mmc_get_status(); #INT_RDA // Ham xu ly ngat noi tiep void Receive_isr() { int c; c = fgetc(); printf("%d",c); } /*-------------------------------------------------------------------------*/ int1 command(int8 bef,long adrh,long adrl,int8 bes) {spi_write(0xff); spi_write(bef); spi_write(make8(adrh,1)); spi_write(make8(adrh,0)); spi_write(make8(adrl,1)); spi_write(make8(adrh,0)); spi_write(bes); spi_write(0xff); return (spi_read(0xff)); } /************************** MMC Init **************************************/ /* Initialises the MMC into SPI mode and sets block size, returns 0 on success */ int mmc_init() { long i; SETUP_SPI(SPI_MASTER | SPI_l_TO_h | SPI_CLK_DIV_16); *0x94 |= 0x40; // set CKE = 1 - clock idle low *0x14 &= 0xEF; // set CKP = 0 - data valid on rising edge cs=1; // set SS = 1 (off) for(i=0;i<1000;i++) // initialise the MMC card into SPI mode by sending clks on { SPI_WRITE(0xff); } cs=0; ; // set SS = 0 (on) tells card to go to spi mode when it receives reset i=20; while((command(0x40,0,0,0x95)!=1)&&(i>0)) { command(0x40,0,0,0x95);--i; } if(i==0) return 1; // precalculated checksum as we are still in MMC mode puts("Sent go to SPI\n\r"); // if = 1 then there was a timeout waiting for 0x01 from the mmc puts("Got response from MMC\n\r"); i = 0; while((i < 255) && (spi_read(0xff)==0)) // must keep sending command if response { SPI_WRITE(0x41); // send mmc command one to bring out of idle state SPI_WRITE(0x00); // all the arguments are 0x00 for command one SPI_WRITE(0x00); SPI_WRITE(0x00); SPI_WRITE(0x00); SPI_WRITE(0xFF); // checksum is no longer required but we always send 0xFF i++; } if(i >= 254) return 1; // if >= 254 then there was a timeout waiting for 0x00 from the mmc puts("Got out of idle response from MMC\n\r"); OUTPUT_HIGH(PIN_C2); // set SS = 1 (off) SPI_WRITE(0xFF); // extra clocks to allow mmc to finish off what it is doing OUTPUT_LOW(PIN_C2); // set SS = 0 (on) SPI_WRITE(0x50); // send mmc command one to bring out of idle state SPI_WRITE(0x00); SPI_WRITE(0x00); SPI_WRITE(0x00); // high block length bits - 512 bytes SPI_WRITE(0x14); // low block length bits SPI_WRITE(0xFe); // checksum is no longer required but we always send 0xFF if((mmc_response(0x00))==1) return 1; OUTPUT_HIGH(PIN_C2); // set SS = 1 (off) puts("Got set block length response from MMC\n\r"); return 0; } /************************** MMC Get Status **************************************/ /* Get the status register of the MMC, for debugging purposes */ int mmc_get_status() { OUTPUT_LOW(PIN_C2); // set SS = 0 (on) SPI_WRITE(0x58); // send mmc command one to bring out of idle state SPI_WRITE(0x00); SPI_WRITE(0x00); SPI_WRITE(0x00); // SPI_WRITE(0x00); // always zero as mulitples of 512 SPI_WRITE(0xFF); // checksum is no longer required but we always send 0xFF OUTPUT_HIGH(PIN_C2); // set SS = 1 (off) return 0; } /*---------------------------------------------------------------------------*/ int1 mmc_write_sector(int32 add,int temp) {int32 j; int8 val,tg; j=add; output_low(pin_c2); SPI_WRITE(0x58); // send mmc write block SPI_WRITE(make8(j,3)); SPI_WRITE(make8(j,2)); SPI_WRITE(make8(j,1)); SPI_WRITE(make8(j,0)); SPI_WRITE(0x00); SPI_WRITE(0xff); if(spi_read(0xff)!=0x05) return 1; SPI_WRITE(0xff); spi_write(0xfe); //crc for(tg=20;tg>0;--tg) Spi_write(temp); spi_write(0xff); //crc spi_write(0xff); //crc if(!(mmc_response(0x00)&&0x1f)==0x05) return 1; printf("ok da 1 xong\n\r"); output_high(pin_c2); return 0; } /*---------------------------------------------------------------------------*/ int mmc_read_block(int32 add,int result) { int32 i; int8 tg; i=add; output_low(pin_c2); spi_write(0x51); SPI_WRITE(make8(i,3)); SPI_WRITE(make8(i,2)); SPI_WRITE(make8(i,1)); SPI_WRITE(make8(i,0)); SPI_WRITE(0x00); SPI_WRITE(0xff); if(spi_read(0xff)!=0) return 1; printf("da doc\n\r"); for(tg=20;tg>0;--tg) result=spi_read(0xff); spi_write(0xff); //crc spi_write(0xff); //crc Output_high(Pin_c2); spi_write(0xff); return result; } /************************** MMC get response **************************************/ /**** Repeatedly reads the MMC until we get the response we want or timeout ****/ int mmc_response(unsigned char response) { unsigned long count = 0xFFFF; // 16bit repeat, it may be possible to shrink this to 8 bit but there is not much point while(SPI_READ(0xFF) != response && --count > 0); if(count==0) return 1; // loop was exited due to timeout else return 0; // loop was exited before timeout } void main() { int add,hi,m; char i,temp; TRISC=0xc3; trisb=0x00; portc=0x00; i=2; add=1024; enable_interrupts(int_rda); enable_interrupts(GLOBAL); mmc_init(); if(mmc_init()==0) printf("Hello PIC Viet Nam!\n\r "); else printf("chan qua! "); } cho em hỏi code của em sai tại đâu mà không thể khởi tạo được MMC. Tức phản hồi R1 của MMC luôn #0x01 thay đổi nội dung bởi: falleaf, 03-12-2008 lúc 12:42 PM. |
![]() |
![]() |
![]() |
#19 |
Nhập môn đệ tử
Tham gia ngày: Sep 2008
Bài gửi: 10
: |
chán quá
Hem ai quan tâm tới vẫn đề này nữa sao?????????????? |
![]() |
![]() |
![]() |
#20 |
...Damned...
Tham gia ngày: Apr 2006
Nơi Cư Ngụ: Hồ Chí Minh
Bài gửi: 522
: |
- Sơ đồ mạch của bạn như thế nào? Trước tiên phải chắc chắn mạch của bạn đúng.
- Bắt đầu từ command nào, thẻ ko phản hồi, hoặc phản hồi sai? |
![]() |
![]() |
![]() |
#21 |
Đệ tử 2 túi
Tham gia ngày: Nov 2008
Bài gửi: 45
: |
chào bạn bogu, hình như bạn copy đoạn code này của một thằng Tây nào đúng không. Code của nó không chạy là vì thế này: để đợi cái Respond 0x01 thì biến đếm i=20 là quá nhỏ, bạn cho to lên cỡ vài nghìn, hoặc vài chục nghìn là chạy ngay (trừ khi phần cứng của bạn có vấn đề). Nhớ là là phải dùng kiểu int16 nhá. Chúc bạn may mắn. À quên, mình có viết một thư viện đọc/ghi/liệt kê/tạo mới/xóa file và thư mục trên thẻ nhớ theo định dạng fat32, tốc độ rất nhanh và chắc chắn dễ dùng hơn của mấy ông Tây kia nhiều... bạn cần thì cứ cho ý kiến nhá.
|
![]() |
![]() |
![]() |
#22 |
Nhập môn đệ tử
Tham gia ngày: Sep 2008
Bài gửi: 10
: |
Em thử mô phỏng trên Proteus7.2
Ngay từ command 1 nó đã không nhận rồi Em kiẻm tra Response R1 nó đã khác 1 làm đi làm lại mãi rùi, mà kể cả cho "i=5000" luôn, như lời debugger cũng hem được nữa Nản quá! Đại ca nào giúp em với! ![]() |
![]() |
![]() |
![]() |
#23 |
Nhập môn đệ tử
Tham gia ngày: Sep 2008
Bài gửi: 10
: |
À wên em gởi lun theo đây file mô phỏng của anh Yankazaz post lên
Mong các anh hồi âm mau mau nhé |
![]() |
![]() |
![]() |
#24 |
Nhập môn đệ tử
Tham gia ngày: Sep 2008
Bài gửi: 10
: |
bạn Deugger ơi, còn Onl không
Bạn có thể cho send cho mình cái thư viện đó mau mau được hem, tại thứ 3 tới là phải gặp thầy lần nữa rùi !!! Cảm ơn bạn trước nhá ![]() |
![]() |
![]() |
![]() |
#25 |
Đệ tử 2 túi
Tham gia ngày: Nov 2008
Bài gửi: 45
: |
Thư viện của mình mới dùng được cho họ MCS-51 và ARM thôi, mình đang port nó sang PIC. Nhưng vấn đề là thư viện của mình sử dụng cache khoảng 2K, trong khi, như bạn biết đấy, RAM của mấy con PIC16 ít quá, lại bị xé lẻ thành nhiều bank. Có lẽ mình sẽ port nó sang thằng PIC24 hoặc 32 thôi.
Để cho nhanh bạn send cho mình cái project của bạn cùng với source code và mô phỏng, mình xem và sửa cho. Mà cái file MMC_PC lúc nãy bạn gửi thiếu file hex và file image |
![]() |
![]() |
![]() |
#26 |
Đệ tử 2 túi
Tham gia ngày: Nov 2008
Bài gửi: 45
: |
Code:
i=20; while((command(0x40,0,0,0x95)!=1)&&(i>0)) { command(0x40,0,0,0x95);--i; } if(i==0) return 1; Code:
command(0x40,0,0,0x95); i=100; while(spi_read(0xFF)!= 0x01) { if(i== 0) return 1; i--; } void command(int8 bef,long adrh,long adrl,int8 bes) Code:
{ spi_write(bef); spi_write(make8(adrh,1)); spi_write(make8(adrh,0)); spi_write(make8(adrl,1)); spi_write(make8(adrh,0)); spi_write(bes); } thay đổi nội dung bởi: falleaf, 03-12-2008 lúc 12:43 PM. |
![]() |
![]() |
![]() |
#27 |
Nhập môn đệ tử
Tham gia ngày: Sep 2008
Bài gửi: 10
: |
Debugger ơi, chán quá thử lại rùi mà vẫn không được
![]() Hay đã giúp thì giúp cho chót, mình đã post mạch với code rồi đó bạn có thể sửa code xong mô phỏng luôn xem chạy chưa Trời ơi, điên đầu với con MMC này gần 5 tuần rồi!! ![]() À t đưa luôn file hex với image của anh Yankazza |
![]() |
![]() |
![]() |
#28 |
Đệ tử 2 túi
Tham gia ngày: Nov 2008
Bài gửi: 45
: |
Cái file MMC_PC bạn bogu gửi lên làm gì có code, cũng không có file hex và file image của mmc nữa, có mỗi 1 cái file proteus thì làm sao mình chạy được. bạn gửi lại đi
|
![]() |
![]() |
![]() |
#29 |
Nhập môn đệ tử
Tham gia ngày: Sep 2008
Bài gửi: 10
: |
Uh, mình quên.Tại gửi file cardimage sẵn trong file của anh Yankazza, nên mình thui
Mình đã gởi kèm luôn cả project MMC và mạch mô phỏng đó. À mình đọc trên diễn đàn thấy nói khi khởi tạo MMC phải giữ tốc độ <400K/s sau khi khởi tạo xong mới được tăng lên cũng chả rõ nữa, nhưng thử luôn rồi mà cũng chẳng xong...hết thuốc cứu??? ![]() |
![]() |
![]() |
![]() |
#30 |
Nhập môn đệ tử
Tham gia ngày: Sep 2008
Bài gửi: 10
: |
À lại quên nữa mình dùng CCS4.03 lập trình cho PIC. Debugger có chưa, nếu chưa bạn download ở đây nè
http://rs111.rapidshare.com/files/32...CWH_v4.033.rar Cảm ơn bạn Debugger nhiệt tình giúp mình nha ![]() |
![]() |
![]() |