| Микроконтролери и електроника 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-битов адрес:
и вътре в нея като най-старши байт в 24-битовия адрес на паметта просто изпращам 0, работи. Ако обаче е така:
компилатора прави едни грозни присвоявания, които нямат нищо общо с истината, при което чете и пише някъде на гьотери из SPI паметта. Като имам време ще се позанимая с асемблерския листинг да видя какъв е точно проблема. Получи се добре, мога да закача SPI SRAM памет към кой да е PIC24/dsPIC3x и примерно чрез
да накарам GCC-то да разглежда ExternalArray[] като външна памет, и същевременно да може да се ползва в сорс кода като нормална C променлива, примерно:
|
|||||||||||||||||||||||||||||||||||||
| Автор: | 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
Wъв втория вариант, когато адреса е зададен като 0L, се генерира правилен код. Адреса се подава правилно в W1:W0, а данните в W2.
Мисля, че няма значение дали са включени оптимизациите или не са. Не съм сигурен дали е бъг в компилатора, или изисква когато като параметри на функции се подават 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 | |||||||||
Това са размерите на данните и декларациите на функциите:
|
||||||||||
| Автор: | woody [ Пет Ное 23, 2012 1:22 pm ] |
| Заглавие: | Re: 23LC1024 |
Прилича като да няма прототип и затова да се предава "int". Виж дали не се е случило нещо такова по погрешка, ако трябва преди първото ползване на функцията набий на ръка прототип. |
|
| Автор: | ¶ [ Пет Ное 23, 2012 1:41 pm ] | ||||||||||||||||||
| Заглавие: | Re: 23LC1024 | ||||||||||||||||||
Не е това, има си коректни прототипи на всички функции. Генерираният код е грешен където и да извикам функциите ReadByte_xxx() и WriteByte_xxx() с 32-битова константа по-малка от 0x00010000 и без суфикс 'L'. Практически компилатора "забравя" и въобще не зарежда байта за запис в W2, ами се предава случайна стойност. Ето примерно(само последното извикване е коректно, адрес = 0x10000000 ):
Както и да е, явно си е бъг в 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 | |||||||||
Погледни листинга, при две различни извиквания се подават по два различни начин параметрите към функцията, а функцията може да приеме само по един-единствен начин последователността от входни параметри. Бих се съгласил с теб, ако се сгомнясваше само подаването на 32-битовия параметър, а то се сгомнясват всички параметри, като последния дори не се подава. При заделянето на памет би трябвало да се води от размера на дефинираната променлива в прототипа, а не от това което аз подавам като число. Ако подавам число, което може да се представи с 16-бита, то трябва просто да нулира старшите 16-бита и пак да подаде на функцията 32-те бита, щото функцията няма как да разбере дали й подават 16 или 32-бита. Проверих и версия MPLAB C 3.30c, и там е същото. За XC16 не намерих лиценз за активация, но предполагам, че и там е така. Не съм погледнал във форума им дали вече не е отворена подобна тема. |
||||||||||
| Автор: | Zdrav [ Съб Ное 24, 2012 11:15 am ] | ||||||||||||||||||||||||||||||||||||
| Заглавие: | Re: 23LC1024 | ||||||||||||||||||||||||||||||||||||
Интересен бъг. Пробвах да го възпроизведа при мен. Компилатора е:
Извиквам го така:
В сорса имам:
В асемблерския листинг:
Всичко изглежда наред. |
|||||||||||||||||||||||||||||||||||||
| Автор: | ¶ [ Съб Ное 24, 2012 6:32 pm ] | |||||||||
| Заглавие: | Re: 23LC1024 | |||||||||
Zdrav, пробвай да сложиш функцията в отделен файл, а да я викаш от втори. Въпреки, че има заглавен файл с правилен прототип в този случай се издънва. Ако е както ти си изпробвал функцията да е в същия файл тогава работи коректно. При мен е следната конфигурация:
|
||||||||||
| Страница 1 от 3 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|