marus-ka 0 26 августа, 2013 Опубликовано 26 августа, 2013 · Жалоба Добрый день! Работают в связке МК XMEGA32D4 и AT45DB041D. Использую команду Continuous Array Read (Low Frequency Mode: 03H): Up to 33MHz, размер страницы 256 байт ( установлено и проверено чтением регистра статуса). При переходе между страницами считываются данные не со следующей страницы, а 0xff. В чем может быть проблема? Не могу понять( void continuous_low_freq_read(unsigned char* in_data, unsigned int page_address, unsigned int byte_address, unsigned int byte_count) { unsigned char dummy; unsigned int i; set_address_bytes(page_address,byte_address); chip_select(); // opcode dummy=SPI_TX_RX(comm_cont_read_low); // three address bytes for (i=0;i<3;i++) dummy=SPI_TX_RX(spi_addr_byte[i]); // input data for (i=0; i<byte_count; i++) in_data[i]=SPI_TX_RX(0xaa); chip_deselect(); } unsigned char SPI_TX_RX(unsigned char data) { SPIC.DATA=data; while(!(SPIC.STATUS&SPI_IF_bm)); return SPIC.DATA; } void set_address_bytes(unsigned int page_address, unsigned int byte_address) { unsigned int temp; temp=page_address; temp>>=7; spi_addr_byte[0]=(unsigned char) temp; temp=(page_address&0x007F); temp<<=1; spi_addr_byte[1]=((unsigned char)(temp))|((unsigned char)(byte_address>>8)); spi_addr_byte[2]=(unsigned char)(byte_address); } #define chip_select() PORTD.OUT&= ~0x02 #define chip_deselect() PORTD.OUT|= 0x02 // command codes for at45 #define comm_cont_read_low 0x03 Запись страницы и чтение в рамках одной страницы происходят корректно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kovigor 5 26 августа, 2013 Опубликовано 26 августа, 2013 · Жалоба В чем может быть проблема? Не могу понять( Буфер, в который вы читаете данные, не переполняется ? Если увеличить его, допустим, вдвое, что произойдет ? И посмотрите, как объявлены счетчики и проч. Возможно, вы используете 8-разрядный тип там, где нужно использовать 32-разрядный. Все должно работать, т.к. в даташите написано: When the end of a page in the main memory is reached during a Continuous Array Read, the device will continue reading at the beginning of the next page ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
marus-ka 0 26 августа, 2013 Опубликовано 26 августа, 2013 (изменено) · Жалоба Буфер, в который вы читаете данные, не переполняется ? Если увеличить его, допустим, вдвое, что произойдет ? И посмотрите, как объявлены счетчики и проч. Возможно, вы используете 8-разрядный тип там, где нужно использовать 32-разрядный. Все должно работать, т.к. в даташите написано: Буфер, в который читаю, не переполняется. На данный момент он 9 байт, я 9 байт и считываю. Даже, если увеличить буфер в два раза, тоже самое. Т.е. пока считывание идет с одной страницы все ок, а когда переходит на другую - 0xff. Ну, 32-разрядные типы не нужны для моей задачи. Для номера страницы, смещения в байтах и количества считываемых байт использую 16-разрядные типы. При этом номер страницы 280, смещение 255 ( например) и количество байт 9, т.е. нет поводов для переполнения. Изменено 26 августа, 2013 пользователем Мария Е Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kovigor 5 26 августа, 2013 Опубликовано 26 августа, 2013 · Жалоба я 9 байт и считываю Вы указываете функции считать 9 байт ? А сколько она реально читает ? Смотрели осциллографом ? А если указать, что нужно считать больше ? Например, разумно предположить, что функции удобно читать данные страницами, а никак не по 9 байт. Попробуйте прочитать две или три страницы, выделив соотв. буфер. Тоже так будет ? А CS вы для чего снимаете ? В даташите четко написано: The CS pin must remain low during the loading of the opcode, the address bytes, and the reading of data. When the end of a page in the main memory is reached during a Continuous Array Read, the device will continue reading at the beginning of the next page Может, у вас из-за этого адрес внутри ИС сбивается ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
marus-ka 0 26 августа, 2013 Опубликовано 26 августа, 2013 (изменено) · Жалоба Вы указываете функции считать 9 байт ? А сколько она реально читает ? Смотрели осциллографом ? А если указать, что нужно считать больше ? Например, разумно предположить, что функции удобно читать данные страницами, а никак не по 9 байт. Попробуйте прочитать две или три страницы, выделив соотв. буфер. Тоже так будет ? Осциллографом не смотрела. Это не так просто, потому что плата плотно скомпонована, но попробую. Как это функции удобно?! Она должна работать, как написано в datasheet. Там никаких ограничений на количество байт нет. Если читать две страницы подряд, то все равно первая страница читается правильно, а вторая - 0xff. А CS вы для чего снимаете ? В даташите четко написано: Может, у вас из-за этого адрес внутри ИС сбивается ... Я снимаю CS, когда заканчиваю считывать нужное мне количество байт. Не вижу противоречия с ds Изменено 26 августа, 2013 пользователем Мария Е Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kovigor 5 26 августа, 2013 Опубликовано 26 августа, 2013 · Жалоба Осциллографом не смотрела. Это не так просто, потому что плата плотно скомпонована, но попробую. Разумных объяснений три: или сбивается адрес внутри ИС, или там реально записаны 0xff, или у вас в программе ошибка. Вы читаете 9 байт, так, что первая их часть попадает в конец первой страницы, а вторая часть - в начало второй страницы ? Не люблю гадать. И без осциллографа почти никогда и ничего не отлаживаю. Самый полезный прибор - осциллограф. Записываете в страницы хорошо различимые на экране осциллографа последовательности (например, 0xaa в одну страницу и 0xcc в следующую) и смотрите, что реально приходит из микросхемы. Байт у вас всего девять, проблем не должно быть. Гадать можно до бесконечности ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
marus-ka 0 26 августа, 2013 Опубликовано 26 августа, 2013 · Жалоба Картинка с осциллографа: Желтым - два последних считываемых байта на линии MISO на границе страниц. Должно быть 0x88 и 0x11. Как видно из картинки там 0x88 и 0xFF. Голубым показан тактовый сигнал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kovigor 5 26 августа, 2013 Опубликовано 26 августа, 2013 · Жалоба Желтым - два последних считываемых байта на линии MISO на границе страниц. Должно быть 0x88 и 0x11. Как видно из картинки там 0x88 и 0xFF. Голубым показан тактовый сигнал. Вот бы еще CS в это время (в момент смены страниц) увидеть. Может, он у вас в единичку встает ? А если не встает, тогда в микросхеме действительно "эфки" записаны. Запишите туда что-нибудь, удостоверьтесь в успешности записи, а потом читайте. Я же говорил: осциллограф - самый полезный прибор ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 26 августа, 2013 Опубликовано 26 августа, 2013 · Жалоба Работают в связке МК XMEGA32D4 и AT45DB041D. Использую команду Continuous Array Read (Low Frequency Mode: 03H): Up to 33MHz, размер страницы 256 байт ( установлено и проверено чтением регистра статуса). При переходе между страницами считываются данные не со следующей страницы, а 0xff. По-моему, для 256-байтовой страницы вы неправильно формируете адрес. Надо так: старшие 8 бит страницы, младшие 8 бит страницы, смещение на странице. И ещё, проверьте Manufacturer and Device ID. А то мне недавно вполне надёжный поставщик прислал перемаркированные под AT25DF641A чипы совсем другого производителя. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
marus-ka 0 27 августа, 2013 Опубликовано 27 августа, 2013 · Жалоба По-моему, для 256-байтовой страницы вы неправильно формируете адрес. Надо так: старшие 8 бит страницы, младшие 8 бит страницы, смещение на странице. И ещё, проверьте Manufacturer and Device ID. А то мне недавно вполне надёжный поставщик прислал перемаркированные под AT25DF641A чипы совсем другого производителя. Спасибо за подсказку :a14: . действительно, проблема была в формировании адреса. Функция была написана для размера страницы 264. А когда я перешла на 256, забыла переписать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться