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 CCS Technical Support

"Pointer type do not match" error MMCSD.c and FAT.
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
PeWa



Joined: 15 Jan 2019
Posts: 22
Location: Sweden

View user's profile Send private message

"Pointer type do not match" error MMCSD.c and FAT.
PostPosted: Mon Jan 06, 2020 6:35 am     Reply with quote

Hello buddies and Happy new year to you all.

I have a strange fault here that I throw out first before I go any further.

First of all the PIC is a 24FJ256GA106 and Compiler is 5.076

When I including these files mmcsd.c and fat.c I got compiler error
first in mmcsd i got "pointer type do not match" here

Code:

MMCSD_err mmcsd_read_ocr(int r3[])
{
   mmcsd_send_cmd(READ_OCR, 0);
   
   return mmcsd_get_r3(r3); <-------------------here (r3)
}


and several "Pointer type do not match" errors in the fat.c file

If I remove fat.c file from the program i cab compile mmcsd.c OK

So there are some error I think with fat.c

Does any one know what this error is before I go in to deep with it.
"Pointer type do not match"

Best regards
Peter
Ttelmah



Joined: 11 Mar 2010
Posts: 19510

View user's profile Send private message

PostPosted: Mon Jan 06, 2020 7:01 am     Reply with quote

Unfortunately, that part of the library was written for PIC16/18 chips.
On these, an 'int' is the same size as an 'int8'.
On the PIC24/30/33 this is no longer the case.
The mmcsd_read_ocr function needs to be changed to:
Code:

MMCSD_err mmcsd_read_ocr(uint8_t* r1)
{
   mmcsd_send_cmd(READ_OCR, 0);
   
   return mmcsd_get_r3(r3);
}

The silly thing is it is correct in the function prototypes....


It's actually a 'warning', rather than an 'error', the code will still compile.
However it is better to fix it.

Generally you need to go through fat.c, and every data definition that uses
just 'int', change to use byte, or uint8_t.
PeWa



Joined: 15 Jan 2019
Posts: 22
Location: Sweden

View user's profile Send private message

PostPosted: Mon Jan 06, 2020 8:55 am     Reply with quote

Hi Ttelmah

Thank's for reply.

Puhh a lot of changes I have made now.

I have get rid of lot of warnings now but a couple still show up.

I have set Signed int to int8 but how about int16 and int32 are they
also need to be altered ?

Here in this routine the &val is throwing Pointer types do not match

Code:

signed int8 fatprintfinfo(FILE* stream)
{
   uint8_t ec = 0;

   int16 val = 0; // buffer to hold values

   char name[MAX_FILE_NAME_LENGTH];

   // get name
   if(get_file_name(stream->Entry_Addr, name) != GOODEC)
      return EOF;

   // printf header
   printf("\r\n\r\n--");
   printf(name);
   printf(" Info--");

   // printf attributes
   ec += mmcsd_read_data(stream->Entry_Addr + 0x0B, 1, &val);
   printf("\r\nAttributes: 0x%X", val);

   // printf creation date
   printf("\r\nCreated: ");
   ec += mmcsd_read_data(stream->Entry_Addr + 0x10, 2, &val);
   disp_datestamp(val);
   printf(" ");

   // printf creation time
   ec += mmcsd_read_data(stream->Entry_Addr + 0x0E, 2, &val);
   disp_timestamp(val);

   // printf modification date
   printf("\r\nModified: ");
   ec += mmcsd_read_data(stream->Entry_Addr + 0x18, 2, &val);
   disp_datestamp(val);
   printf(" ");

   // printf modification time
   ec += mmcsd_read_data(stream->Entry_Addr + 0x16, 2, &val);
   disp_timestamp(val);

   // printf starting cluster
   ec += mmcsd_read_data(stream->Entry_Addr + 0x14, 2, (int16*)&val + 1);
   ec += mmcsd_read_data(stream->Entry_Addr + 0x1A, 2, &val);

   printf("\r\nStarting cluster: %lX", val);

   // printf starting address
   printf("\r\nStarting address: %lX", cluster_to_addr(val));

   // printf size
   ec += mmcsd_read_data(stream->Entry_Addr + 0x1C, 4, &val);
   printf("\r\nSize: %lu Bytes\r\n", val);

   if(ec != GOODEC)
      return EOF;

   return GOODEC;
}

#endif // #ifndef FAT_PIC_C
Ttelmah



Joined: 11 Mar 2010
Posts: 19510

View user's profile Send private message

PostPosted: Mon Jan 06, 2020 9:41 am     Reply with quote

On these larger PICs, the default 'int', is a signed int16. Similarly all standard
integers are treated as signed, unless explicitly declared as unsigned.
So 'int32' on a PIC24, is a 'signed int32' on a PIC18. int32 on a PIC18, is
an unsigned int32 on a PIC24. Same for the int16.
This is why I campaign for people to use stdint.h, and the types declared in
this. These are the same whichever processor family you are using... Smile
PeWa



Joined: 15 Jan 2019
Posts: 22
Location: Sweden

View user's profile Send private message

PostPosted: Mon Jan 06, 2020 10:52 am     Reply with quote

Ok

1 thing left then.

I now try to open a file that is created on the SD media Logg.txt

FILE *file_stream;

char filename[] = "Logg.txt";

mmcsd_init();
fat_init();
fatopen(filename,"a", &file_stream); <------------

It gives me an error in the fat.c here
Code:

 if(set_file(target_file, 0x10, &cur_stream) != GOODEC)
      {
         cur_stream.Flags |= File_Not_Found;
         *stream = cur_stream;
         return EOF;
      }
      depth -= 1;
   }



That the function is used but not defined , that is strange because it is defined in the top of fat.c

How can this be ?


Code:

signed int16 fatopen(char fname[], char mode[], FILE* stream)
{
   uint8_t fname_parse_pos = 1;    // the current index of the fname character

   char target_file[MAX_FILE_NAME_LENGTH];   // temporary buffer to hold names of files
 
   FILE cur_stream;      // this will   be the stream that will be returned if all goes well
 

#ifndef FAST_FAT
   uint8_t
      depth = 0,              // how many subdirectories deep the file is
      target_file_parse_pos;  // the current index of the target_file character
#endif // #ifndef FAST_FAT

   // set flags
#ifdef FAST_FAT
   switch(mode[0])
   {
      case 'w':
         cur_stream.Flags = Write;
         break;
      case 'a':
         cur_stream.Flags = Append;
         break;
      default:
         return EOF;
   }

   // start looking for the file, start at root
   cur_stream.Start_Addr = cur_stream.Parent_Start_Addr = Root_Dir;

   while(fname[fname_parse_pos] != '\0')
   {
      target_file[fname_parse_pos - 1] = fname[fname_parse_pos];
      fname_parse_pos += 1;
   }

   target_file[fname_parse_pos] = '\0';

   // find the file inside of its subdirectory
   if(set_file(target_file, 0x20, &cur_stream) != GOODEC)
   {
      cur_stream.Flags |= File_Not_Found;
      *stream = &cur_stream;
      return EOF;
   }

   // at this point, we've found the file
  *stream = cur_stream;
   return GOODEC;
#else // NO FAST_FAT
   switch(mode[0])
   {
      case 'r':
         cur_stream.Flags = Read;
         break;
      case 'w':
         cur_stream.Flags = Write;
         break;
      case 'a':
         cur_stream.Flags = Append;
         break;
      default:
         return EOF;
   }

   if(mode[1] == 'b')
      cur_stream.Flags |= Binary;

   // start looking for the file, start at root
   cur_stream.Start_Addr = cur_stream.Parent_Start_Addr = Root_Dir;

   // figure out how deep we have to go, count how many '/' we have in the string
   while(fname[fname_parse_pos] != '\0')
   {
      if(fname[fname_parse_pos] == '/')
         depth++;
      fname_parse_pos += 1;
   }

   // start the fname index at 1 to skip over the '/'
   fname_parse_pos = 1;

   // open up to the subdirectory, if possible
   while(depth > 0)
   {
      // find the name of our next target directory
      target_file_parse_pos = 0;
      while(fname[fname_parse_pos] != '/')
      {
         // check to make sure that we're not at the end of a poorly formatted string
         if(fname[fname_parse_pos] == '\0')
            return EOF;

         // fill up the buffer and increment the indexes
         target_file[target_file_parse_pos] = fname[fname_parse_pos];
         fname_parse_pos += 1;
         target_file_parse_pos += 1;
      }

      // increment the fname index one more because it's currently pointing at the '/'
      fname_parse_pos += 1;

      // tack on a \0 to the end of the target file to terminate the string
      target_file[target_file_parse_pos] = '\0';

      // check to see if the directory exists and open it if possible, otherwise exit because the directory doesn't exist
      if(set_file(target_file, 0x10, &cur_stream) != GOODEC)
      {
         cur_stream.Flags |= File_Not_Found;
         *stream = cur_stream;
         return EOF;
      }
      depth -= 1;
   }

   // check to see if we're trying to open just a directory
   if(fname[fname_parse_pos] == '\0')
   {
      *stream = cur_stream;
      return GOODEC;
   }

   // now that we have the location of the subdirectory that the file is in, attempt to open the file
   target_file_parse_pos = 0;
   while(fname[fname_parse_pos] != '\0')
   {
      // fill up the buffer and increment the indexes
      target_file[target_file_parse_pos] = fname[fname_parse_pos];
      fname_parse_pos += 1;
      target_file_parse_pos += 1;
   }

   // tack on a \0 to the end of the target file to terminate the string
   target_file[target_file_parse_pos] = '\0';

   // find the file inside of its subdirectory
   if(set_file(target_file, 0x20, &cur_stream) != GOODEC)
   {
      cur_stream.Flags |= File_Not_Found;
      *stream = cur_stream;
      return EOF;
   }

   // at this point, we've found the file
   *stream = cur_stream;
   return GOODEC;
#endif // #ifdef FAST_FAT
}
 
jeremiah



Joined: 20 Jul 2010
Posts: 1348

View user's profile Send private message

PostPosted: Mon Jan 06, 2020 11:29 am     Reply with quote

Usually that means you aren't supplying the right parameter so it is trying to call an overloaded version that doesn't exist. Look at your file stream variable. It is already a FILE * but you are trying to pass it with & which turns it into a FILE **.
PeWa



Joined: 15 Jan 2019
Posts: 22
Location: Sweden

View user's profile Send private message

PostPosted: Mon Jan 06, 2020 11:50 am     Reply with quote

Ok I get rid of the Pointer now and it found the function but

Code:

  FILE file_stream;
   
  char filename[] = "Logg.txt";
   
   mmcsd_init();
   fat_init();
   fatopen(filename,"a", file_stream);     


Now I get Error 51 "A numeric expression must appear here" at the place of
file_stream the Fatopen is an pointer stream input.
Code:

signed int16 fatopen(char fname[], char mode[], FILE* stream);
Ttelmah



Joined: 11 Mar 2010
Posts: 19510

View user's profile Send private message

PostPosted: Mon Jan 06, 2020 12:57 pm     Reply with quote

In your previous post you were using:

FILE *file_stream, and then passing with &.
Now you are using FILE file_stream and passing without &.
You need one or the other. Either use a FILE * variable, or pass with &.
One or the other, not both.

Also do you have #device PASS_STRINGS=IN_RAM near the top of
your code?. This is needed to allow a constant string to be passed to
the function as "a".
PeWa



Joined: 15 Jan 2019
Posts: 22
Location: Sweden

View user's profile Send private message

PostPosted: Mon Jan 06, 2020 1:16 pm     Reply with quote

Yep I have the

#device PASS_STRINGS=IN_RAM

in top of header file after #include processor defs.


If I set FILE *file_stream to a pointer with *
I get the same error again that the function used but not defined.

If I change to set the address at function with &file_stream but not on the FILE *file_stream.

I get the same error "function used but not defined "so either way
it gives error.

Can it be something with the fat.c that I use on this PIC24 that still gives me the problem I wonder ?
Ttelmah



Joined: 11 Mar 2010
Posts: 19510

View user's profile Send private message

PostPosted: Mon Jan 06, 2020 3:02 pm     Reply with quote

OK.
I've just taken the example ex_fat.c, and changed it to use a PIC24.
Then did a search and replace and replaced all declarations using 'int' (with
white space each side), into 'uint8_t'. Then searched for 'signed uint8_t', and
replaced this with 'int8_t'.
This then gives all standard int declarations changed to uint8_t, and
all that were declared as signed, still as signed.
Does give the warnings about pointer types, but happily compiles.
PeWa



Joined: 15 Jan 2019
Posts: 22
Location: Sweden

View user's profile Send private message

PostPosted: Tue Jan 07, 2020 3:18 am     Reply with quote

Hi Ttelmah

I'm on it I included ex_fat , it seems to be conflicts with drivers,
it use fat.c from driver lib, I have compiled it OK but must sort out what happens.

I saw that I could get media Init OK returned 0 , but only on an old 32MB SD card, I have tried FAT16 and 32 but no differ

But if media init is OK does that means that the hardware connections are right? and SPI is UP ?
Even that I have OK for init it can not appendfile (ie open file)
I can check SPI with logic analyser later also.

Will be away for while now and get back for about 9 hours

ThankĀ“s for all help so far.
Ttelmah



Joined: 11 Mar 2010
Posts: 19510

View user's profile Send private message

PostPosted: Tue Jan 07, 2020 3:38 am     Reply with quote

OK.

Media init, initialises certain variables dependant on what it is reading
from the card. It does not 'error check' what is being read. You need to
look at the variables it has initialised and see if it is making sense of
the values.
The variables are:

Bytes_per_Cluster
FAT_Length
FAT_Start
Root_Dir
Data_Start

In the fat driver, there is a little routine to display the FAT statistics:

disp_fat_stats()

Call this after calling the init, to see what is being read.
PeWa



Joined: 15 Jan 2019
Posts: 22
Location: Sweden

View user's profile Send private message

PostPosted: Thu Jan 09, 2020 9:44 am     Reply with quote

Hello again.

I tested the disp_fat_stats() and it showed strange values or same values
on different SD cards so I understand that it could be some wrong with the wiring.

However I also changed the MCU to the example MCU that are in the ex_fat example, PIC18F67J60 and trying the example code that uses the fat.c and mmcsd.c with a little menu system. Just to check my hardware and learn little more about SD card reading/writing.

The ex_fat.c is compiling fine, except the warnings we had before "pointers types do not match".

The program is running and in the fat_init it reports OK
But I can not do any commands it will show error.
But now I have a easier system with PIC18 to test this on now.

I putted in the disp_fat_stats after the init in this working program and that showed same result also on different cards so i think that this is why it does not work.

I have hooked up SPI analyser also so I can check lines and what I can see right now is that the SDO line from SD card is not sending any data only SDI and clock and CS is working.

So I have to investigate this little more, Data I/O has been working before
in some other code I tested so it is something in the default driver/program.
temtronic



Joined: 01 Jul 2010
Posts: 9226
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Thu Jan 09, 2020 10:29 am     Reply with quote

OK, basic Hardware questions.... What voltage is the PIC VDD and what interface is between PIC and SD card ?
dluu13



Joined: 28 Sep 2018
Posts: 395
Location: Toronto, ON

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

PostPosted: Thu Jan 09, 2020 12:22 pm     Reply with quote

One of the first things to try is to read the sticky thread in the code library about mmcsd.c and fat.c to fix the library (MBR fix) and the sticky thread about SD card in the General CCS C Discussion forum.

If you want to see if it's the hardware, one of the things you can try is to directly use functions from mmcsd.c rather than trying to use the FAT filesystem. One quick thing to check is if you get good results from mmcsd_print_cid() and mmcsd_print_csd().

Then, you can format the card to all zeros, and then start to write known numbers into memory locations that you define. Use a hex editor like HxD on your PC to view the data and make sure that you actually wrote what you expected.

If these all work as expected then it's probably something to do with the FAT code rather than your hardware.

A good resource for SD card if you want to read further is http://www.elm-chan.org/. Wikipedia is also pretty good.

Personally, I was never able to get the CCS FAT/SD card drivers working and I ended up buying the Brush Electronics driver. It does cost a bit, but it's easy to use and the author (asmallri on this forum) is responsive to questions.
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