CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to support@ccsinfo.com

Flash card read and write.
Goto page 1, 2  Next
 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
young



Joined: 24 Jun 2004
Posts: 285

View user's profile Send private message

Flash card read and write.
PostPosted: Tue Feb 15, 2005 1:14 pm     Reply with quote

I am going to develop a device to write and read data to and from a flash card. any idea how it works it? thanks in advance!
dyeatman



Joined: 06 Sep 2003
Posts: 1924
Location: Norman, OK

View user's profile Send private message

PostPosted: Tue Feb 15, 2005 1:25 pm     Reply with quote

Try searching this site for the words "flash card" (set to search for all terms) and you will find a lot about it including code. There is also code in the Code Library.

Last edited by dyeatman on Tue Feb 15, 2005 9:28 pm; edited 1 time in total
Mark



Joined: 07 Sep 2003
Posts: 2838
Location: Atlanta, GA

View user's profile Send private message Send e-mail

PostPosted: Tue Feb 15, 2005 9:27 pm     Reply with quote

Oh my goodness! Sorry, I just had to get that out.
lucky



Joined: 12 Sep 2003
Posts: 46
Location: South Coast - England

View user's profile Send private message Visit poster's website

CF Read code
PostPosted: Wed Feb 16, 2005 9:12 am     Reply with quote

http://www.mpic3.com

Check the Compact Flash Fat16 code in the downloads area. (reads only).
_________________
Lucky
www.mpic3.com - MPIC3 player project, Forum, Downloads, Online Shop
young



Joined: 24 Jun 2004
Posts: 285

View user's profile Send private message

PostPosted: Thu Mar 17, 2005 7:42 am     Reply with quote

Hi Lucky:
Sorry I was distracted from this project for a while, and I am coming back to work on it.

here are some concepts that I want to clearify.

1. In your cf.c code, what does CF_SetAddress(BYTE address) means

Code:
CF_SetAddress(BYTE address){

output_bit(CF_ADDRESS_0,bit_test(address,0));
output_bit(CF_ADDRESS_1,bit_test(address,1));
output_bit(CF_ADDRESS_2,bit_test(address,2));
}


CF_ADDRESS_0, CF_ADDRESS_1, CF_ADDRESS_2, should be defined as

Code:


#define CF_ADDRESS_0   PIN_A0
#define CF_ADDRESS_1   PIN_A1
#define CF_ADDRESS_2   PIN_A2

or some other pins of microcontroller, right?

and other CF_READ, CF_WRITE etc. should be defined to pins connect to flashcart pin oe,we,etc. right?

2. the variable BYTE address in the CF_SetAddress(BYTE address) definition is corredponding to the eight control registers, right?

3. CF is read and write at a 512 bytes per time, right? how do you setup the right sectors to w/r the data, is it like this,

for read,
a. setup control register to 0x03 using, 03 is sector number
CF_SetAddress(0x03)
b, enable oe line, which is defined by CF_READ
output_low(CF_READ)
c, put data to portd, which is data line the sector number, for example, if I want to go to sector 200 then output_d(200)

d, and then go the data reading set control register as CF_SetAddress(0x00)
e. enable oe output_low(CF_READ)
f, read data data=portd

clearify me where I am wrong?
young



Joined: 24 Jun 2004
Posts: 285

View user's profile Send private message

PostPosted: Thu Mar 17, 2005 7:46 am     Reply with quote

Just to correct a typo

Quote:
for read,
a. setup control register to 0x03 using, 03 is sector number
CF_SetAddress(0x03)
b, enable oe line, which is defined by CF_READ
output_low(CF_READ)
c, put data to portd, which is data line the sector number, for example, if I want to go to sector 200 then output_d(200)

d, and then go the data reading set control register as CF_SetAddress(0x00)
e. enable oe output_low(CF_READ)
f, read data data=portd


a. 03 is sector number should be 03 is control register for sector number[/code]
lucky



Joined: 12 Sep 2003
Posts: 46
Location: South Coast - England

View user's profile Send private message Visit poster's website

CF Read code
PostPosted: Thu Mar 17, 2005 7:55 am     Reply with quote

Hi young,

Download the MPic3 player code zip and the MPic3 player diagram and this will answer all of your questions. You are correct in what you have put and CF_SetAddress(BYTE address) is simply used to select the correct address on the CF address lines. Goto www.mpic3.com/downloads you should also try www.mpic3.com/forum for advice from the other users of this code.
_________________
Lucky
www.mpic3.com - MPIC3 player project, Forum, Downloads, Online Shop
young



Joined: 24 Jun 2004
Posts: 285

View user's profile Send private message

PostPosted: Thu Mar 17, 2005 8:50 am     Reply with quote

THANK YOU LUCKY:
I already download the zip code, and had been studing your code. and I went to the forum, I did not find what I want to know, by the way, it is a great website

so far for the pins definition is clearfied by you, however, I need more detailed step by step understanding of how CF w/r works, please help me out of this.

1. I did not see how you use register to go to a sector, is my discription in the last post correct.

2. in your code, there is a int32 compactFlastPosition variable, and it is used in
Code:

void compactFlashReadBuffer(int32 offset, int32 length){
   int32 i;
   for(i=compactFlashPosition;i<offset;i++){
      compactFlashPosition++;
      CF_ReadData(0);
   }
   for(i=0;i<length;i++){
      compactFlashPosition++;
      buffer[i]=CF_ReadData(0);
   }
}


what is exactly compactFlastPosition means, it is a address? how do you go to the compactFlashPosition? for example, if I want to go to 33550000
location (32M=33554432), and offset 0, and length 10, I have to let

Code:
compactFlastPosition=33550000;


and then call the function compactFlashReadBuffer(0,10). I believe it is wrong, would you please explain how compactFlashReadBuffer() works?

Thanks again
lucky



Joined: 12 Sep 2003
Posts: 46
Location: South Coast - England

View user's profile Send private message Visit poster's website

CF Read code
PostPosted: Thu Mar 17, 2005 9:12 am     Reply with quote

Hi young,

1) get_sector() is used to skip to the required location on the CF. This can be seen in FAT16.c when find_file() is used to read the mp3. get_sector() then writes all of the required data (head, cylinder, mode etc) to the CF then calls compactFlashReadBuffer() to get 512 bytes of data (does not have to be 512 bytes).

2) compactFlastPosition is just used to keep track of how far in to the CF you have read as each read will incrament the counter inside of the CF.

To read sector 128 you could simply call get_sector(128); then the first 512 bytes of sector 128 would be in buffer[0] - buffer[511].
_________________
Lucky
www.mpic3.com - MPIC3 player project, Forum, Downloads, Online Shop
young



Joined: 24 Jun 2004
Posts: 285

View user's profile Send private message

PostPosted: Thu Mar 17, 2005 9:45 am     Reply with quote

Thnak you:

You are leading me to solutions------>

in your get_sector function, why you define sectors=32, int heads=16, and what is the a means here and why there is a for loop to increase what is the k means?
Code:

   a=heads*sectors;
   for(sector=sector;sector>=a;sector=sector-a)   k++;
young



Joined: 24 Jun 2004
Posts: 285

View user's profile Send private message

PostPosted: Thu Mar 17, 2005 10:09 am     Reply with quote

I found out that 1 track=32cluster, 1 clusterr=16sectors a should be the total sectors per track, right?
Mark



Joined: 07 Sep 2003
Posts: 2838
Location: Atlanta, GA

View user's profile Send private message Send e-mail

PostPosted: Thu Mar 17, 2005 10:11 am     Reply with quote

Microsoft has FAT specifications. Take a look at them and most of this will make sense to you.
young



Joined: 24 Jun 2004
Posts: 285

View user's profile Send private message

PostPosted: Thu Mar 17, 2005 10:14 am     Reply with quote

Thank you, by the calculation I now understand how your get_sectors works, thank for being with me.I start to write a write_sector function according to your code, please help me. I will post the code soon for you to check!
lucky



Joined: 12 Sep 2003
Posts: 46
Location: South Coast - England

View user's profile Send private message Visit poster's website

CF Read code
PostPosted: Thu Mar 17, 2005 10:18 am     Reply with quote

young,

This is the calcualtions to find the correct head and cylinder for the requested sector.

sectors and heads should be read from the CF and populated in read_boot_sector() (the commented out bit) but this was work in progress and I never got this working so I set sectors and heads manuly.

This code could probably use some optimisation and clean-up but it does work. I am continuing the MPic3 player project in a few weeks time when I get my first proper PCB's in. I will then re-work this code to improve it and make it more readable and add comments etc. It has been a long time since I have worked on it and it was all left in a bit of a mess with work still in progress.

Please sign up to the MPic3 forum.
_________________
Lucky
www.mpic3.com - MPIC3 player project, Forum, Downloads, Online Shop
young



Joined: 24 Jun 2004
Posts: 285

View user's profile Send private message

PostPosted: Thu Mar 17, 2005 10:26 am     Reply with quote

HI lucky:

Please help me to the code for writing data

here is a function corresponding to compactFlashWriteBuffer.
Code:

void compactFlashWriteBuffer(int32 offset, int32 length){
   int32 i;
   for(i=compactFlashPosition;i<offset;i++){
      compactFlashPosition++;
      CF_ReadData(0);
   }
   for(i=0;i<length;i++){
      compactFlashPosition++;
      WRITE_CF_DATA(0,buffer[i]);

   }
}

but I do not know if this part is necessary or not


Code:

   for(i=compactFlashPosition;i<offset;i++){
      compactFlashPosition++;
      CF_ReadData(0);
   }


here is the corresponding for get_sector

Code:

void write_sector(int32 sector){
   int32 i;
   int32 k=0;
   int32 a=0;
   int32 sectors=32;
   int32 heads=16;
   compactFlashPosition=0;
   a=heads*sectors;
   for(sector=sector;sector>=a;sector=sector-a)   k++;
   WRITE_CF_DATA(5,k>>8);         // write cylinder
   WRITE_CF_DATA(4,k);
   k=0;
   for(sector=sector;sector>=sectors;sector=sector-sectors) k++;
   WRITE_CF_DATA(3,sector+1);      // write sector
   WRITE_CF_DATA(6,k+0xA0);         // write head
   WRITE_CF_DATA(2,1);
   WRITE_CF_DATA(7,0x20);
   delay_us(200);      // Wait For Data
   compactFlashWriteBuffer(0,512);
}


please light me up with your genius thought
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group