|
23k256, как использовать эту ram |
|
|
|
Apr 6 2015, 07:20
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 12-03-15
Пользователь №: 85 618

|
не могу понять как считывать и записывать данные в эту озу. даташит читаю - и ни х. не понимаю. Если не тяжело растолкуйте. пытаюсь так: send data 2; while(усл); send data adr; //0 while (усл); send data data; while (flag); вообще не могу догнать правильно или нет,блуждаю как ежик в тумане.
|
|
|
|
|
Apr 7 2015, 04:52
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 12-03-15
Пользователь №: 85 618

|
хорошо,попробую.Непонятно, если я запишу 10 байт, то как их считать?В даташите написано: команда 3;2 байта адр;и дальше читаем данные.Как читаются данные - непонятен принцип действия.Вроде мастер должен чтото запихивать чтобы чтото получить от РАМки?
|
|
|
|
|
Apr 7 2015, 06:07
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(jukebox @ Apr 7 2015, 09:52)  хорошо,попробую.Непонятно, если я запишу 10 байт, то как их считать?В даташите написано: команда 3;2 байта адр;и дальше читаем данные.Как читаются данные - непонятен принцип действия.Вроде мастер должен чтото запихивать чтобы чтото получить от РАМки? общий алгоритм такой Код void Write(uint32_t address, uint32_t lenght, uint8_t *buffer) { // Note!!!Every write operation demands a write enable!!! //SPI_CSlow(); //SPI_SendByte(SPIEEPROM_CMD_WREN); //SPI_CShigh();
// start write SPI_CSlow(); // send write command SPI_SendByte(SPIEEPROM_CMD_WRITE); // send address SPI_SendByte(address>>8); SPI_SendByte(address&0x00FF); while(lenght--) { // send data to be written SPI_SendByte(*buffer++); } // stop write SPI_CShigh(); }
void Read(uint32_t address, uint32_t lenght, uint8_t *buffer) { if(lenght>PAGE_SIZE) return 0; uint32_t data; // start read SPI_CSlow(); // send command SPI_SendByte(SPIEEPROM_CMD_READ); // send address SPI_SendByte(address>>8); SPI_SendByte(address&0x00FF); // read contents of memory address while(lenght--) { data = SPI_TransferByte(0x00); *buffer++ = data; } // stop read SPI_CShigh(); }
|
|
|
|
|
Apr 7 2015, 08:51
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 12-03-15
Пользователь №: 85 618

|
не получается,чтото упускаю.Пишу на кокосе,там таких функций нет.Мне нужно понять порядок действий. пишу так, упрощенно : spi1->DR=1; //write status reg while (flag); ...=0x41; // hold off,max size data //-----
...=2; // write wh(); ...=0; //adr wh(); ...=0; //adr wh(); ...= data; wh(); //---- ...=3; //read wh(); ...=0; // adr wh(); ...=0; // adr wh(); data = spi1->DR;
|
|
|
|
|
Apr 7 2015, 09:52
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 12-03-15
Пользователь №: 85 618

|
Цитата(Herz @ Apr 7 2015, 09:25)  Неужели? А что такое "кокос? Орех такой? Если имеется в виду движок Cocos, так он, вроде, базируется на С++, нет? Да кокос он и среди орехов CooCox.Других кокосов в stm32 нету. Лучше помогите понять алгоритм действий.
|
|
|
|
|
Apr 12 2015, 06:35
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 12-03-15
Пользователь №: 85 618

|
Цитата(esaulenka @ Apr 10 2015, 09:35)  Не надо "писать на кокосе". Надо по-человечески, отделяя мух от котлет. Эх, любите вы умники к мелочам придираться.Да, правильно написать В СооСох-е. А озу как уперлась так и продолжает сопротивляться. С передачей данных из модуля spi проблем нет, данные уходят.Вот только не приходят из озу.Ножки входа и выходов настроены. Надо чтото попроще погонять, датчики наверное.Там опыта наберусь, осилю и озу.
|
|
|
|
|
Apr 13 2015, 05:57
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 12-03-15
Пользователь №: 85 618

|
Цитата(jcxz @ Apr 12 2015, 15:32)  Что такое "сигнал CS" знаете?  Что такое чип селект я знаю, как он относится к озу я знаю. Если можете, подскажите что делать с выводом HOLD для нормальной работы, и как правильно настроить регистр конфигурации в озу.
|
|
|
|
|
Apr 14 2015, 08:39
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 12-03-15
Пользователь №: 85 618

|
Ааа.Эта полный трэшшшщь.Уже и сниффер сваял для проверки линий, и статей перечитал и осталось шаг за шагом вычистить ошибки ... и плата дискавери здохла.Ну надо ж такое. Всем кто реально помогал спасибо человеческое.Буду думать что дальше делать.
|
|
|
|
|
Apr 14 2015, 18:59
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 12-03-15
Пользователь №: 85 618

|
Осцилограф есть эл-лучевой ещё советский или около того, как им смотреть протокол - без понятия, уровни меняются сигналы какието проходят,но развертки линий во времени просмотреть нереально.Програмно собирался сделать, если через модуль ничего не будет получаться.Как получить развертку на компе - не нашел подходящих вариантов.Есть анализатор для LPT порта от Валерия Ковтуна, но у меня сигналы на развертке рисовались искаженными, а то и вовсе не фиксировались.Вроде он подходит для медленных процессов. Насчет CS, если вариант hard, то со шлейфом 20 см spi зависает намертво в первом же цикле ожидания опустошения флага.В начале отправки данных, перед строкой с send data включаю синяка(PC8), и по окончанию while (flag) выключаю его.Если провода на CS выводе нет, то синяк выдает едва заметный блик, правда DIV_128, если провод подцепить синяк светит ярко. Вместо CS(оставил висеть в воздухе) задействовал соседний PC4 с соотв уровнями 0 и 1 когда надо.Со шлейфом так spi не виснет и данные выдаются.Со сниффером успел проверить линию CLK,счетчик четко фиксирует приход 8 импульов, или 16 если перем data объявил 16 битной.Также через rlf на др входе и прер по нужным фронтам от CLK собрался проверить что передается по линиям mosi и miso, но плата накрылась.В идеале было бы хорошо смотреть развертку линий на компе и иметь программу симуляторов протоколов с возможностью взаимодействовать с контроллерами, но эта фонтастик.Вот такие пироги.
|
|
|
|
|
Apr 15 2015, 20:04
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 12-03-15
Пользователь №: 85 618

|
Цитата(jcxz @ Apr 15 2015, 02:23)  Не знаю какие у вас там синяки, но я вроде ясно написал выше: повесьте хотя-бы светодиоды на все линии (CS, SCLK, MOSI, MISO) и по шагам отладьте. Если уж и это непонятно, то и не знаю как ещё советовать. Да понятно, чего тут может быть непонятного.Куплю подходящий контроллер и дожму эту озу.
|
|
|
|
|
Jul 15 2015, 19:30
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 12-03-15
Пользователь №: 85 618

|
Цитата(jukebox @ Apr 15 2015, 21:04)  Да понятно, чего тут может быть непонятного.Куплю подходящий контроллер и дожму эту озу. Ну чтож, все оказалось просто. Принцип следующий : CS = 0 0х1 opcode (byte,page,sequential) CS =1 --- CS = 0 0х2 ; запись adr adr data CS = 1 ---==== CS = 0 0х3 ; чтение adr adr 8 impulses CLK ; на MISO появл data CS = 1
|
|
|
|
|
Jan 19 2017, 12:52
|
Группа: Новичок
Сообщений: 1
Регистрация: 19-01-17
Пользователь №: 95 070

|
Всем привет. Тоже начал знакомство с этой микросхемой на XMega128A1. Потыкал осциллографом при попытках чтения SPI и тактируется по CLK и данные идут из MOSI но ответа от чипа нет. Вот код для SRAM. Код /*Привязка к линиям микроконтроллера*/ #define SRAM_SPI SPIC //Регистр SPI #define SRAM_PORT PORTC //PORT SPI #define SRAM_CS_PORT PORTC //Доступ к чипу #define SRAM_CS_PIN 3 #define SRAM_HOLD_PORT PORTC //Запрет записи #define SRAM_HOLD_PIN 4 #define SRAM_MOSI_PORT PORTC //MOSI #define SRAM_MOSI_PIN 5 #define SRAM_MISO_PORT PORTC //MISO #define SRAM_MISO_PIN 6 #define SRAM_SCK_PORT PORTC //SCK #define SRAM_SCK_PIN 7
void SRAM_Init(void){ SRAM_SPI.DATA = 0; SRAM_PORT.DIR &= ~(1 << SRAM_MISO_PIN); SRAM_PORT.DIR |= (1 << SRAM_HOLD_PIN) | (1 << SRAM_MOSI_PIN) | (1 << SRAM_SCK_PIN) | (1 << SRAM_CS_PIN); SRAM_SPI.CTRL = SPI_ENABLE_bm | SPI_MASTER_bm | SPI_MODE_0_gc | SPI_PRESCALER_DIV128_gc; SRAM_HOLD_PORT.OUT |= (1 << SRAM_HOLD_PIN); SRAM_CS_PORT.OUT &= ~(1 << SRAM_CS_PIN); _delay_us(1); SRAM_SPI.DATA = 0x1; while(!(SPIC.STATUS & (1<<7))); SRAM_SPI.DATA = 0x0; while(!(SPIC.STATUS & (1<<7))); SRAM_CS_PORT.OUT |= (1 << SRAM_CS_PIN); } uint8_t SRAM_Write(uint16_t addr, uint8_t data){ SRAM_CS_PORT.OUT &= ~(1 << SRAM_CS_PIN); _delay_us(1); SRAM_SPI.DATA = 0x2; while(!(SPIC.STATUS & (1<<7))); SRAM_SPI.DATA = addr >> 8; while(!(SPIC.STATUS & (1<<7))); SRAM_SPI.DATA = addr & 0xFF; while(!(SPIC.STATUS & (1<<7))); SRAM_SPI.DATA = data; while(!(SPIC.STATUS & (1<<7))); SRAM_CS_PORT.OUT |= (1 << SRAM_CS_PIN); return SPIC.DATA; } uint8_t SRAM_Read(uint16_t addr){ SRAM_CS_PORT.OUT &= ~(1 << SRAM_CS_PIN); _delay_us(1); SRAM_SPI.DATA = 3; while(!(SPIC.STATUS & (1<<7))); SRAM_SPI.DATA = addr >> 8; while(!(SPIC.STATUS & (1<<7))); SRAM_SPI.DATA = addr & 0xFF; while(!(SPIC.STATUS & (1<<7))); SRAM_CS_PORT.OUT |= (1 << SRAM_CS_PIN); return SRAM_SPI.DATA; } Кто хорошо знаком с данным чипом, помогите пожалуйста.
|
|
|
|
|
Jan 19 2017, 16:43
|
Профессионал
    
Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848

|
Цитата(ostroukhovio @ Jan 19 2017, 15:52)  Всем привет. Тоже начал знакомство с этой микросхемой на XMega128A1. Потыкал осциллографом при попытках чтения SPI и тактируется по CLK и данные идут из MOSI но ответа от чипа нет. . . . Кто хорошо знаком с данным чипом, помогите пожалуйста. Юзал я давненько этот девайс но на на XMmega а на MSP430. Оно как-то "завелось" сразу, даже и воспоминаний не осталось. 0. Проверьте аппаратную часть (разводка-подключение, обрывы и сопли, питание, отсутствие помех итд ) 1. Проверьте что настройки SPI процессора (полярность и фаза) соотв-ют требуемым для 23k256 2. Возможно что причина - в некорректной работе приемника SPI процессора из-за настроек или в софте драйвера, обеспечивающего работу узла SPI. Для начала отключите 23k256 от SPI и соедините MOSI - MISO. Проверите и правильность "улета" и "прилета" по SPI. 3. Как ОНО работает - подробнейшим образом расписано выше. ps - эти мс есть на разное питание. Проверьте соотв-ие.
Сообщение отредактировал k155la3 - Jan 19 2017, 16:45
|
|
|
|
|
May 22 2017, 10:14
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 12-03-15
Пользователь №: 85 618

|
Кто хорошо знаком с данным чипом, помогите пожалуйста. [/quote]
ostroukhovio вы ввели два байта адреса для считывания, и не продолжили вводить третий байт (пустой), во время введения которого из озу исходит байт данных. Адрес для теста лучше писать первый байт 0, второй (младший) - какой то до 10.Так проще.
Сообщение отредактировал jukebox - May 22 2017, 10:37
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|