Полная версия этой страницы:
23k256
jukebox
Apr 6 2015, 07:20
не могу понять как считывать и записывать данные в эту озу.
даташит читаю - и ни х. не понимаю.
Если не тяжело растолкуйте.
пытаюсь так:
send data 2;
while(усл);
send data adr; //0
while (усл);
send data data;
while (flag);
вообще не могу догнать правильно или нет,блуждаю как ежик в тумане.
toweroff
Apr 6 2015, 16:20
А что непонятного? Настраивается регистр с режимом работы, потом команда, за ней - данные. Как данные будут следовать - настроили в регистре. Все.
jukebox
Apr 7 2015, 04:52
хорошо,попробую.Непонятно, если я запишу 10 байт, то как их считать?В даташите написано: команда 3;2 байта адр;и дальше читаем данные.Как читаются данные - непонятен принцип действия.Вроде мастер должен чтото запихивать чтобы чтото получить от РАМки?
Цитата(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();
}
jukebox
Apr 7 2015, 08:51
не получается,чтото упускаю.Пишу на кокосе,там таких функций нет.Мне нужно понять порядок действий.
пишу так, упрощенно :
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;
Цитата(jukebox @ Apr 7 2015, 11:51)
не получается,чтото упускаю.Пишу на кокосе,там таких функций нет.Мне нужно понять порядок действий.
Неужели? А что такое "кокос? Орех такой?
Если имеется в виду движок Cocos, так он, вроде, базируется на С++, нет?
jukebox
Apr 7 2015, 09:52
Цитата(Herz @ Apr 7 2015, 09:25)
Неужели? А что такое "кокос? Орех такой?
Если имеется в виду движок Cocos, так он, вроде, базируется на С++, нет?
Да кокос он и среди орехов CooCox.Других кокосов в stm32 нету.
Лучше помогите понять алгоритм действий.
esaulenka
Apr 10 2015, 09:35
Не надо "писать на кокосе".
Надо по-человечески, отделяя мух от котлет.
Предлагаю организовать интерфейс с шиной SPI:
- активация слейва
- деактивация слейва
- обмен одним байтом (чтение/запись)
Для удобства можно организовать дополнительно:
- запись байта (вызов функции обмена, считанный байт "забыть")
- чтение байта (вызов функции обмена, записать ноль).
Собственно, этот программный интерфейс "сам" рождается после изучения любой статьи, найденной в гугле по запросу "шина spi описание".
А только потом из этого сооружать обмен с конкретной микросхемой.
jukebox
Apr 12 2015, 06:35
Цитата(esaulenka @ Apr 10 2015, 09:35)
Не надо "писать на кокосе".
Надо по-человечески, отделяя мух от котлет.
Эх, любите вы умники к мелочам придираться.Да, правильно написать В СооСох-е.
А озу как уперлась так и продолжает сопротивляться.
С передачей данных из модуля spi проблем нет, данные уходят.Вот только не приходят из озу.Ножки входа и выходов настроены.
Надо чтото попроще погонять, датчики наверное.Там опыта наберусь, осилю и озу.
Цитата(jukebox @ Apr 12 2015, 12:35)
[Надо чтото попроще погонять, датчики наверное.Там опыта наберусь, осилю и озу.
Что такое "сигнал CS" знаете?
jukebox
Apr 13 2015, 05:57
Цитата(jcxz @ Apr 12 2015, 15:32)
Что такое "сигнал CS" знаете?
Что такое чип селект я знаю, как он относится к озу я знаю.
Если можете, подскажите что делать с выводом HOLD для нормальной работы, и как правильно настроить регистр конфигурации в озу.
Jenya7
Apr 14 2015, 05:19
Цитата(jukebox @ Apr 13 2015, 11:57)
Что такое чип селект я знаю, как он относится к озу я знаю.
Если можете, подскажите что делать с выводом HOLD для нормальной работы, и как правильно настроить регистр конфигурации в озу.
HOLD и WP посадите на VCC.
регистр конфигурации трогать не надо.
jukebox
Apr 14 2015, 08:39
Ааа.Эта полный трэшшшщь.Уже и сниффер сваял для проверки линий, и статей перечитал и осталось шаг за шагом вычистить ошибки ... и плата дискавери здохла.Ну надо ж такое.
Всем кто реально помогал спасибо человеческое.Буду думать что дальше делать.
Цитата(jukebox @ Apr 13 2015, 11:57)
Что такое чип селект я знаю, как он относится к озу я знаю.
Сами сигналы смотрели (осциллограф, лог.анализатор)? Может у вас там по выходу ничего не шевелится.
Если ни того ни другого нет, можно и светодиодами: делаете программный SPI и по шагам.... (так как SPI во всех таких микросхемах полностью статический).
Сверяете с осциллограммами в даташите.
jukebox
Apr 14 2015, 18:59
Осцилограф есть эл-лучевой ещё советский или около того, как им смотреть протокол - без понятия, уровни меняются сигналы какието проходят,но развертки линий во времени просмотреть нереально.Програмно собирался сделать, если через модуль ничего не будет получаться.Как получить развертку на компе - не нашел подходящих вариантов.Есть анализатор для 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, но плата накрылась.В идеале было бы хорошо смотреть развертку линий на компе и иметь программу симуляторов протоколов с возможностью взаимодействовать с контроллерами, но эта фонтастик.Вот такие пироги.
Не знаю какие у вас там синяки, но я вроде ясно написал выше: повесьте хотя-бы светодиоды на все линии (CS, SCLK, MOSI, MISO) и по шагам отладьте.
Если уж и это непонятно, то и не знаю как ещё советовать.
jukebox
Apr 15 2015, 20:04
Цитата(jcxz @ Apr 15 2015, 02:23)
Не знаю какие у вас там синяки, но я вроде ясно написал выше: повесьте хотя-бы светодиоды на все линии (CS, SCLK, MOSI, MISO) и по шагам отладьте.
Если уж и это непонятно, то и не знаю как ещё советовать.
Да понятно, чего тут может быть непонятного.Куплю подходящий контроллер и дожму эту озу.
jukebox
Jul 15 2015, 19:30
Цитата(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
ostroukhovio
Jan 19 2017, 12:52
Всем привет. Тоже начал знакомство с этой микросхемой на 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;
}
Кто хорошо знаком с данным чипом, помогите пожалуйста.
k155la3
Jan 19 2017, 16:43
Цитата(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 - эти мс есть на разное питание. Проверьте соотв-ие.
jukebox
May 22 2017, 10:14
Кто хорошо знаком с данным чипом, помогите пожалуйста.
[/quote]
ostroukhovio вы ввели два байта адреса для считывания, и не продолжили вводить третий байт (пустой), во время введения которого из озу исходит байт данных.
Адрес для теста лучше писать первый байт 0, второй (младший) - какой то до 10.Так проще.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.