Отговори на тема  [ 31 мнения ]  Отиди на страница 1, 2, 3  Следваща
23LC1024 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 23LC1024
Някой пускал ли е SPI SRAM памет 23LC1024 , 128kb x 8-bit ?

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

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

_________________
Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....


Сря Ное 21, 2012 7:49 pm
Профил WWW
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Нед Окт 19, 2008 7:26 pm
Мнения: 673
Мнение Re: 23LC1024
http://www.ccsinfo.com/forum/viewtopic.php?t=48991&view=next
Не съм работил с подобни ни, но търсех нещо друго и попаднах на това, преди няколко дни.

_________________
Вниманиене съмвишист....ИЙ.


Сря Ное 21, 2012 8:03 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 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;

_________________
Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....


Сря Ное 21, 2012 10:41 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Мар 22, 2006 3:25 am
Мнения: 6418
Мнение Re: 23LC1024
отдавна беше и не помня версията на CCS но си спомням че имах няколко пъти подобни проблеми с компилирането, първо се рових из асемблера докато разбера че прави глупости, а след това просто пренаписвам кода който не работи по друг начин и изведнъж заработва, най често ми е правил проблема кoгато трябва да работи с различни по размер или тип променливи


Чет Ное 22, 2012 12:23 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 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-а на професора.

_________________
Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....


Чет Ное 22, 2012 8:19 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Юли 31, 2007 2:55 pm
Мнения: 1792
Местоположение: София
Мнение Re: 23LC1024
"int" типът 16 бита ли е?


Чет Ное 22, 2012 8:45 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Яну 19, 2007 9:16 am
Мнения: 1063
Местоположение: путинофили: "иди н***й"
Мнение Re: 23LC1024
как е дефинирана WriteByte_23LC1024 ?


Пет Ное 23, 2012 1:22 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 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);

_________________
Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....


Пет Ное 23, 2012 5:28 am
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Юли 31, 2007 2:55 pm
Мнения: 1792
Местоположение: София
Мнение Re: 23LC1024
Прилича като да няма прототип и затова да се предава "int". Виж дали не се е случило нещо такова по погрешка, ако трябва преди първото ползване на функцията набий на ръка прототип.


Пет Ное 23, 2012 1:22 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 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г. употреба това е първият бъг който забелязвам. Ще видя дали и в последните им версии не е засррано положението.

_________________
Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....


Пет Ное 23, 2012 1:41 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Юли 31, 2007 2:55 pm
Мнения: 1792
Местоположение: София
Мнение Re: 23LC1024
Прилича на бъг, защото няма как да има две конвенции за параметрите като в случая.
Първите пет са еднакви, защото по подразбиране промоцията е до "int".


Пет Ное 23, 2012 2:00 pm
Профил
Ранг: Популярен
Ранг: Популярен

Регистриран на: Сря Яну 25, 2006 12:47 pm
Мнения: 305
Местоположение: Varna
Мнение Re: 23LC1024
прев, мисля че това е вярно: "подават 32-битови константи да са задължително със суфикса 'L'"
имал съм същия проблем с GCC компилатора. И си мисля, че проблемът не е при използването на констаната, а при заделянето на памет за нея.


Пет Ное 23, 2012 7:59 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение Re: 23LC1024
bkulev написа:
прев, мисля че това е вярно: "подават 32-битови константи да са задължително със суфикса 'L'"
имал съм същия проблем с GCC компилатора. И си мисля, че проблемът не е при използването на констаната, а при заделянето на памет за нея.


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

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

_________________
Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....


Съб Ное 24, 2012 12:29 am
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 26, 2005 2:01 pm
Мнения: 1952
Местоположение: Варна
Мнение 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 11:15 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 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

_________________
Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....


Съб Ное 24, 2012 6:32 pm
Профил WWW
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 31 мнения ]  Отиди на страница 1, 2, 3  Следваща

Кой е на линия

Потребители разглеждащи този форум: Google [Bot] и 0 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни