Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

23LC1024
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=10821
Страница 1 от 3

Автор:  [ Сря Ное 21, 2012 7:49 pm ]
Заглавие:  23LC1024

Някой пускал ли е SPI SRAM памет 23LC1024 , 128kb x 8-bit ?

Това чудо не мога да го подкарам от 2 дни, пробвам от 100kHz до 10MHz, четене в средата на clock-а, четене в края, запис по растящ/падащ фронт, накрая се усъмних в SPI модула на процесора ( то какво да му има, 3 регистъра на кръст, на скопа го гледам каквото му кажа това прави ) и направих софтуерен SPI , същата работа. Процесора е dsPIC30F5015, на 10 MIPS работи, но определено проблема не е в него. Пробвам на повече от една платка, разлика няма.

Маркировката на чипа е също съмнителна, би трябвало да е 23LC1024, а маркиран като 23LCBI, закупуван е от Mouser. Гледах примерни програми за 23K256, който е с по-малко памет и има един бит в mode регистъра, с който бит може да се бъзика HOLD сигнала, нищо по-различно не правя.

Автор:  RM [ Сря Ное 21, 2012 8:03 pm ]
Заглавие:  Re: 23LC1024

http://www.ccsinfo.com/forum/viewtopic.php?t=48991&view=next
Не съм работил с подобни ни, но търсех нещо друго и попаднах на това, преди няколко дни.

Автор:  [ Сря Ное 21, 2012 10:41 pm ]
Заглавие:  Re: 23LC1024

Пуснах я, хардуерно/софтуерно, byte/page/sequential режим :)

Оказва се, че има някакъв проблем в компилатора ( 3.24 ). Ако примерно функцията за четене е с 16-битов адрес:
Код:
uint8 ReadByte_23LC1024(uint16 address);

и вътре в нея като най-старши байт в 24-битовия адрес на паметта просто изпращам 0, работи.

Ако обаче е така:
Код:
uint8 ReadByte_23LC1024(uint32 address);

компилатора прави едни грозни присвоявания, които нямат нищо общо с истината, при което чете и пише някъде на гьотери из SPI паметта.

Като имам време ще се позанимая с асемблерския листинг да видя какъв е точно проблема.


Получи се добре, мога да закача SPI SRAM памет към кой да е PIC24/dsPIC3x и примерно чрез
Код:
__external__ uint8 ExternalArray[131072] __attribute__((address(0x00),space(external(ex_sram_space))));

да накарам GCC-то да разглежда ExternalArray[] като външна памет, и същевременно да може да се ползва в сорс кода като нормална C променлива, примерно:

Код:
ExternalArray[0] = 0x5A;
ExternalArray[131071] = 0xA5;

Автор:  nik [ Чет Ное 22, 2012 12:23 pm ]
Заглавие:  Re: 23LC1024

отдавна беше и не помня версията на CCS но си спомням че имах няколко пъти подобни проблеми с компилирането, първо се рових из асемблера докато разбера че прави глупости, а след това просто пренаписвам кода който не работи по друг начин и изведнъж заработва, най често ми е правил проблема кoгато трябва да работи с различни по размер или тип променливи

Автор:  [ Чет Ное 22, 2012 8:19 pm ]
Заглавие:  Re: 23LC1024

Тук става въпрос за GCC 4.0.3 ( MPLAB C v3.24 ), а не за CCS.

В първия вариант, когато адреса е 0 се генерира неправилен код, нулира се само W0, а
трябва да се нулират W1:W0, данните се подават в W1, а трябва да са в W2
Код:
            WriteByte_23LC1024( 0/*Address -> W1:W0*/, 0x01/* Data -> W2*/ );
004636  200011     MOV #0x1, W1 // W1 = 0x01, wrong, W2 should be = 0x01
004638  EB0000     CLR W0 // W0 = 0, wrong, W1:W0 must be = 0
00463A  07FCFC     RCALL WriteByte_23LC1024
283:               


Wъв втория вариант, когато адреса е зададен като 0L, се генерира правилен код. Адреса
се подава правилно в W1:W0, а данните в W2.
Код:
284:      WriteByte_23LC1024( 0L/*Address -> W1:W0*/, 0x01/* Data -> W2*/ );
00463C  200012     MOV #0x1, W2 // Correct, W2 = 1
00463E  B80060     MUL.UU W0, #0, W0 // Correct, W1:W0 = 0
004640  07FCF9     RCALL WriteByte_23LC1024


Мисля, че няма значение дали са включени оптимизациите или не са. Не съм сигурен дали е бъг в компилатора, или изисква когато като параметри на функции се подават 32-битови константи да са задължително със суфикса 'L' . Ако като 32-битов параметър на функция се подаде 32-битова променлива тогава няма проблем.

Иначе паметта си работи, пробвах я до 10MHz. На 20MHz не съм я пробвал, тъй като трябва да сменям коефициентите на PLL-а на професора.

Автор:  woody [ Чет Ное 22, 2012 8:45 pm ]
Заглавие:  Re: 23LC1024

"int" типът 16 бита ли е?

Автор:  ps66 [ Пет Ное 23, 2012 1:22 am ]
Заглавие:  Re: 23LC1024

как е дефинирана WriteByte_23LC1024 ?

Автор:  [ Пет Ное 23, 2012 5:28 am ]
Заглавие:  Re: 23LC1024

Това са размерите на данните и декларациите на функциите:
Код:
#if defined __C30__   // PIC24F, PIC24H, dsPIC30, dsPIC33, dsPIC33E
    typedef enum _bool { false = 0, true } bool;
    typedef char int8;
    typedef unsigned char uint8;
    typedef signed short int   int16;
    typedef unsigned short int uint16;
    typedef signed long int32;
    typedef unsigned long uint32;
    typedef signed long long int64;
    typedef unsigned long long uint64;
    typedef float   float32;
    typedef long double   double64;
#endif

uint8   ReadByte_23LC1024(uint32 address);
void   ReadSeq_23LC1024(uint32 address, uint8 *data, uint16 length);
void   WriteByte_23LC1024(uint32 address, uint8 data);
void   WriteSeq_23LC1024(uint32 address, uint8 *data, uint16 length);

Автор:  woody [ Пет Ное 23, 2012 1:22 pm ]
Заглавие:  Re: 23LC1024

Прилича като да няма прототип и затова да се предава "int". Виж дали не се е случило нещо такова по погрешка, ако трябва преди първото ползване на функцията набий на ръка прототип.

Автор:  [ Пет Ное 23, 2012 1:41 pm ]
Заглавие:  Re: 23LC1024

woody написа:
Прилича като да няма прототип и затова да се предава "int". Виж дали не се е случило нещо такова по погрешка, ако трябва преди първото ползване на функцията набий на ръка прототип.


Не е това, има си коректни прототипи на всички функции. Генерираният код е грешен където и да извикам функциите ReadByte_xxx() и WriteByte_xxx() с 32-битова константа по-малка от 0x00010000 и без суфикс 'L'. Практически компилатора "забравя" и въобще не зарежда байта за запис в W2, ами се предава случайна стойност. Ето примерно(само последното извикване е коректно, адрес = 0x10000000 ):
Код:
                           Init_23LC1024();
00447C  07FD68     RCALL Init_23LC1024
281:               
282:               
283:                  WriteByte_23LC1024( 0/*W1:W0*/, 0x01/*W2*/ );
00447E  200011     MOV #0x1, W1
004480  EB0000     CLR W0
004482  07FDD8     RCALL WriteByte_23LC1024
284:                  WriteByte_23LC1024( 0x00000000/*W1:W0*/, 0x01/*W2*/ );
004484  200011     MOV #0x1, W1
004486  EB0000     CLR W0
004488  07FDD5     RCALL WriteByte_23LC1024
285:                  WriteByte_23LC1024( 0x0000E00E/*W1:W0*/, 0x01/*W2*/ );
00448A  200011     MOV #0x1, W1
00448C  2E00E0     MOV #0xE00E, W0
00448E  07FDD2     RCALL WriteByte_23LC1024
286:                  WriteByte_23LC1024( 0x0000F00F/*W1:W0*/, 0x01/*W2*/ );
004490  200011     MOV #0x1, W1
004492  2F00F0     MOV #0xF00F, W0
004494  07FDCF     RCALL WriteByte_23LC1024
287:                  WriteByte_23LC1024( 0x0000FFFF/*W1:W0*/, 0x01/*W2*/ );
004496  200011     MOV #0x1, W1
004498  EB8000     SETM W0
00449A  07FDCC     RCALL WriteByte_23LC1024
288:                  WriteByte_23LC1024( 0x10000000/*W1:W0*/, 0x01/*W2*/ );
00449C  200012     MOV #0x1, W2
00449E  200000     MOV #0x0, W0
0044A0  210001     MOV #0x1000, W1
0044A2  07FDC8     RCALL WriteByte_23LC1024


Както и да е, явно си е бъг в Microchip версията на GCC. За почти 2г. употреба това е първият бъг който забелязвам. Ще видя дали и в последните им версии не е засррано положението.

Автор:  woody [ Пет Ное 23, 2012 2:00 pm ]
Заглавие:  Re: 23LC1024

Прилича на бъг, защото няма как да има две конвенции за параметрите като в случая.
Първите пет са еднакви, защото по подразбиране промоцията е до "int".

Автор:  bkulev [ Пет Ное 23, 2012 7:59 pm ]
Заглавие:  Re: 23LC1024

прев, мисля че това е вярно: "подават 32-битови константи да са задължително със суфикса 'L'"
имал съм същия проблем с GCC компилатора. И си мисля, че проблемът не е при използването на констаната, а при заделянето на памет за нея.

Автор:  [ Съб Ное 24, 2012 12:29 am ]
Заглавие:  Re: 23LC1024

bkulev написа:
прев, мисля че това е вярно: "подават 32-битови константи да са задължително със суфикса 'L'"
имал съм същия проблем с GCC компилатора. И си мисля, че проблемът не е при използването на констаната, а при заделянето на памет за нея.


Погледни листинга, при две различни извиквания се подават по два различни начин параметрите към функцията, а функцията може да приеме само по един-единствен начин последователността от входни параметри. Бих се съгласил с теб, ако се сгомнясваше само подаването на 32-битовия параметър, а то се сгомнясват всички параметри, като последния дори не се подава. При заделянето на памет би трябвало да се води от размера на дефинираната променлива в прототипа, а не от това което аз подавам като число. Ако подавам число, което може да се представи с 16-бита, то трябва просто да нулира старшите 16-бита и пак да подаде на функцията 32-те бита, щото функцията няма как да разбере дали й подават 16 или 32-бита.

Проверих и версия MPLAB C 3.30c, и там е същото. За XC16 не намерих лиценз за активация, но предполагам, че и там е така. Не съм погледнал във форума им дали вече не е отворена подобна тема.

Автор:  Zdrav [ Съб Ное 24, 2012 11:15 am ]
Заглавие:  Re: 23LC1024

Интересен бъг.
Пробвах да го възпроизведа при мен.

Компилатора е:
Код:
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\Documents and Settings\3gpabko>pic30-gcc -v
Microchip Language Tool Shell Version v3_30 (Build date: Jun 21 2011).
Copyright (c) 2006 Microchip Technology Inc. All rights reserved
Executing: "E:\Microchip\mplabc30\v3.30c\bin\bin/pic30-coff-gcc.exe"
   "-v"
Using built-in specs.
Target: pic30-coff
Configured with: /Users/cawilkie/dev/builds/build_20110621/src/gcc-4.0.2/gcc-4.0
.2/configure --target=pic30-coff --build=i386-darwin --host=i386-mingw32 --progr
am-prefix=pic30-coff- --enable-languages=c --with-included-gettext
Thread model: single
gcc version 4.0.3 (dsPIC30, Microchip v3_30) Build date: Jun 29 2011


Извиквам го така:
Код:
... -O2 -g -Wall -mcpu=24FJ32GA002 -x c -c


В сорса имам:

Код:
...
typedef     unsigned char      uint8;
typedef     unsigned short    uint16;
typedef     unsigned long      uint32;
...
void   dummy(uint32 param1, uint8 param2)
....
dummy(0x0f, 16);
....


В асемблерския листинг:
Код:
    4e5c:   02 c1 b3       mov.b     #0x10, w2
    4e5e:   f0 00 20       mov.w     #0xf, w0
    4e60:   01 00 20       mov.w     #0x0, w1
    4e62:   c6 ff 07       rcall     0x4df0 <_dummy>


Всичко изглежда наред.

Автор:  [ Съб Ное 24, 2012 6:32 pm ]
Заглавие:  Re: 23LC1024

Zdrav, пробвай да сложиш функцията в отделен файл, а да я викаш от втори. Въпреки, че има заглавен файл с правилен прототип в този случай се издънва. Ако е както ти си изпробвал функцията да е в същия файл тогава работи коректно.

При мен е следната конфигурация:
Код:
Linux DesktopPC 2.6.32-45-generic #99-Ubuntu SMP Tue Oct 16 16:31:11 UTC 2012 i686 GNU/Linux

Microchip Language Tool Shell Version v3_24 (Build date: Jul 12 2010).
Copyright (c) 2006 Microchip Technology Inc. All rights reserved
Executing: "/opt/microchip/mplabc30/v3.24/bin/bin/pic30-coff-gcc" "-v"
Using built-in specs.
Target: pic30-coff
Configured with: /Users/cawilkie/dev/builds/build_20100712/src/gcc-4.0.2/gcc-4.0.2/configure --target=pic30-coff --build=i386-darwin --host=i386-linux --program-prefix=pic30-coff- --enable-languages=c
Thread model: single
gcc version 4.0.3 (dsPIC30, Microchip v3_24) Build date: Jul 12 2010

Microchip Language Tool Shell Version v3_30 (Build date: Jun  2 2011).
Copyright (c) 2006 Microchip Technology Inc. All rights reserved
Executing: "/opt/microchip/mplabc30/v3.30c/bin/bin/pic30-coff-gcc" "-v"
Using built-in specs.
Target: pic30-coff
Configured with: /Users/cawilkie/dev/builds/build_20110602/src/gcc-4.0.2/gcc-4.0.2/configure --target=pic30-coff --build=i386-darwin --host=i386-linux --program-prefix=pic30-coff- --enable-languages=c --with-included-gettext
Thread model: single
gcc version 4.0.3 (dsPIC30, Microchip v3_30) Build date: Jun  2 2011

Страница 1 от 3 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/