реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Проблемы с EEPROM, общение по I2C, при помощи MSP430
sergeeff Jr.
сообщение Nov 12 2010, 23:10
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 568
Регистрация: 8-07-07
Из: Занзибар
Пользователь №: 28 964



Вообщем вроде все как надо. Пишу по адресу 0x00 в 24LC00 значение (в этом примере 0x56), а читаю (Random Read, то есть по конкретному адресу) почему то 0xFF (то есть ничего не записалось получается, т.к. в памяти EEPROM по умолчению сидит 0xFF). Картинки в приложении. Вроде все верно. Пока не понял в чем дело. Может у вас есть какие-то идеи...

Вот описание 24LC00
http://ww1.microchip.com/downloads/en/DeviceDoc/21178E.pdf
Прикрепленные файлы
Прикрепленный файл  TEK0002.BMP ( 76.05 килобайт ) Кол-во скачиваний: 25
Прикрепленный файл  TEK0003.BMP ( 76.05 килобайт ) Кол-во скачиваний: 17
 


--------------------
"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие
Go to the top of the page
 
+Quote Post
DmitryM
сообщение Nov 13 2010, 05:05
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840



Цитата(sergeeff Jr. @ Nov 13 2010, 03:10) *
Вообщем вроде все как надо. Пишу по адресу 0x00 в 24LC00 значение (в этом примере 0x56), а читаю (Random Read, то есть по конкретному адресу) почему то 0xFF (то есть ничего не записалось получается, т.к. в памяти EEPROM по умолчению сидит 0xFF). Картинки в приложении. Вроде все верно. Пока не понял в чем дело. Может у вас есть какие-то идеи...


А где repeated start при чтении??
Go to the top of the page
 
+Quote Post
sergeeff Jr.
сообщение Nov 13 2010, 12:56
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 568
Регистрация: 8-07-07
Из: Занзибар
Пользователь №: 28 964



Да, кстати его и нет. Спасибо! cheers.gif


--------------------
"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие
Go to the top of the page
 
+Quote Post
sergeeff Jr.
сообщение Nov 22 2010, 23:41
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 568
Регистрация: 8-07-07
Из: Занзибар
Пользователь №: 28 964



Как это не смешно я перелопатил все примеры от TI, но так и не понял, как ИМЕННО в MSP430F2013 cделать этот repeated start. Такое впечатление, что его нужно делать "вручную", но никакого приятного глазу решения так и не придумал. Может что подскажете?

Я просто на данный момент задачу подругому решил (repeated start не понадобился), но интерес распирает... smile.gif


--------------------
"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 23 2010, 00:01
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(sergeeff Jr. @ Nov 23 2010, 04:41) *
Такое впечатление, что его нужно делать "вручную"

Именно "вручную" laughing.gif
Цитата("MSP430x2xx Family User's Guide")
14.2.4 I2C Mode
...
START Condition

A START condition is a high-to-low transition on SDA while SCL is high. The START condition can be generated by setting the MSB of the shift register to 0. Setting the USIGE and USIOE bits makes the output latch transparent and the MSB of the shift register is immediately presented to SDA and pulls the line low. Clearing USIGE resumes the clocked-latch function and holds the 0 on SDA until data is shifted out with SCL.
Go to the top of the page
 
+Quote Post
sergeeff Jr.
сообщение Nov 23 2010, 00:17
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 568
Регистрация: 8-07-07
Из: Занзибар
Пользователь №: 28 964



При первом START'e все так и есть. Но проблема в том, что у меня после переданного байта SDA low, а SCL high. То есть мне надо сделать SCL low, а потом SDA high... Ну то есть получается, что я NACK должен выплюнуть перед START...


--------------------
"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 23 2010, 00:27
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Дык я не понял, в чем затруднения-то? В каком именно месте NACK смущает? Выдержка из спецификации I2C.
Цитата
There are five conditions that lead to the generation of a NACK:
...
5.A master-receiver needs to signal the end of the transfer to the slave transmitter.
Go to the top of the page
 
+Quote Post
sergeeff Jr.
сообщение Nov 23 2010, 07:21
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 568
Регистрация: 8-07-07
Из: Занзибар
Пользователь №: 28 964



Смущает то, что никакого NACK быть не должно
http://ww1.microchip.com/downloads/en/DeviceDoc/21178E.pdf (Figure 8-2)


--------------------
"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 23 2010, 17:50
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(sergeeff Jr. @ Nov 23 2010, 12:21) *
Смущает то, что никакого NACK быть не должно
А откуда он там по-вашему должен получаться? Ведь после передачи 8-и бит SCL тормозится. Далее зарядили через USICNT передачу одного бита со значением 0. Это будет передачей ACK. После передачи одного бита (ACK) SCL опять тормозится. Формируем "вручную" повторный старт. Заряжаем следующие 8 бит на прием или передачу. Записываем 8 в USICNT. Поехали. Где тут "лишний" NACK получается-то? cranky.gif
Go to the top of the page
 
+Quote Post
sergeeff Jr.
сообщение Nov 23 2010, 19:36
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 568
Регистрация: 8-07-07
Из: Занзибар
Пользователь №: 28 964



После ACK линия SDA остается на нуле, соответственно по описанному в даташите методу никакого START не будет...


--------------------
"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие
Go to the top of the page
 
+Quote Post
KRS
сообщение Nov 23 2010, 20:27
Сообщение #11


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Вообще то после чтения последнего байта надо NACK выставлять, так устройство поймет что больше ничего передавать не надо, это везде так. И в даташите это написано (на картинках).
Go to the top of the page
 
+Quote Post
sergeeff Jr.
сообщение Nov 23 2010, 20:56
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 568
Регистрация: 8-07-07
Из: Занзибар
Пользователь №: 28 964



Еще раз смотрим
http://ww1.microchip.com/downloads/en/DeviceDoc/21178E.pdf (Figure 8-2)


--------------------
"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие
Go to the top of the page
 
+Quote Post
KRS
сообщение Nov 23 2010, 21:19
Сообщение #13


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



да бага значит в даташите! должен быть NACK по идее.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 23 2010, 22:33
Сообщение #14


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (sergeeff Jr. @ Nov 23 2010, 22:56) *
Еще раз смотрим
Вообще-то это ACK, который формирует память в ответ на ваши байты. И который говорит вам о том, что адрес она "скушала". В первой посылке вы сформировали R/W = 0, значит вы передаете байты а память отвечает вам ACKи. И так до стопа или повторного старта. Сформировали стоп-старт или повторный старт, передали первый байт с R/W=1 - все, теперь память посылает байты а вы ей в ответ - ACKи. И снова до стопа/повторного старта.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
sergeeff Jr.
сообщение Nov 23 2010, 23:22
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 568
Регистрация: 8-07-07
Из: Занзибар
Пользователь №: 28 964



Так вот вопрос в том, КАК!!! послать после ACK'а, который я получил - повторный старт.


--------------------
"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 24 2010, 00:09
Сообщение #16


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (sergeeff Jr. @ Nov 24 2010, 01:22) *
Так вот вопрос в том, КАК!!! послать после ACK'а, который я получил - повторный старт.
С точки зрения сигналов - подаете 0 на SCL, память отпускает SDA, отпускаете SCL, подаете 0 на SDA - получаете старт. Как это сделать средствами вашего контроллера - не подскажу...


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 24 2010, 02:59
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(sergeeff Jr. @ Nov 24 2010, 00:36) *
После ACK линия SDA остается на нуле, соответственно по описанному в даташите методу никакого START не будет...
Я не работал непосредственно с USI вживую и вынужден доверять вам, но вот читаю в UG раздел 14.2.4 I2C Mode -> I2C Master Mode и вижу
Цитата
To configure the USI module as an I2C master the USIMST bit must be set. In master mode, clocks are generated by the USI module and output to the SCL line while USIIFG = 0. When USIIFG = 1, the SCL will stop at the idle, or high, level. Multi-master operation is supported as described in the Arbitration section.
The master supports slaves that are holding the SCL line low only when USIDIVx > 0. When USIDIVx is set to /1 clock division (USIDIVx = 0), connected slaves must not hold the SCL line low during data transmission. Otherwise the communication may fail.
У вас ведь режим мастер вроде? Так почему после передачи 8 бит SCL в нуле остается? У м/с EEPROM нет возможности управлять уровнем SCL. У нее SCL это чистый вход.
Go to the top of the page
 
+Quote Post
sergeeff Jr.
сообщение Nov 24 2010, 07:24
Сообщение #18


Знающий
****

Группа: Свой
Сообщений: 568
Регистрация: 8-07-07
Из: Занзибар
Пользователь №: 28 964



SCL как раз и получает high level (см. картинки в начале, там тоже видно). А менять значение SDA я не могу, пока SCL high.


--------------------
"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 24 2010, 08:43
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(sergeeff Jr. @ Nov 24 2010, 12:24) *
SCL как раз и получает high level (см. картинки в начале, там тоже видно).
Нифига там не понятно. Вы бы еще в микроскоп предложили эти картинки рассматривать. sad.gif Как вы ACK на аппаратный адрес EEPROM получаете? Фрагмент кода приведите.
Цитата(sergeeff Jr. @ Nov 24 2010, 12:24) *
А менять значение SDA я не могу, пока SCL high.
Почему не можете? Ведь изменение SDA во время SCL=high как раз и создает старт- или стоп-условие.
Go to the top of the page
 
+Quote Post
sergeeff Jr.
сообщение Nov 24 2010, 19:00
Сообщение #20


Знающий
****

Группа: Свой
Сообщений: 568
Регистрация: 8-07-07
Из: Занзибар
Пользователь №: 28 964



Переход снизу вверх создает стоп (мне не надо этого, потому что я еще не закончил передачу), а переход сверху вниз создает СТАРТ, но чтобы сделать этот переход мне надо сначала наверх попасть... smile.gif

А примеры кода тут
http://www.ti.com/litv/zip/slac080i (кстати свежак, но с i2c все по старому)
msp430x20x3_usi_06.c

Самых интересных вещей
msp430x20x3_usi_10.с
msp430x20x3_usi_11.с
там к сожалению нет...
А в
msp430x20x3_usi_16.c
никакого RESTART на самом деле нет.


--------------------
"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 24 2010, 19:23
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(sergeeff Jr. @ Nov 25 2010, 00:00) *
Переход снизу вверх создает стоп (мне не надо этого, потому что я еще не закончил передачу), а переход сверху вниз создает СТАРТ, но чтобы сделать этот переход мне надо сначала наверх попасть... smile.gif
Ой, чей-то я не вкуриваю. sad.gif Откуда снизу вверх-то? cranky.gif Перед тем как возникает нужда сделать restart (а нужда эта возникает только при RANDOM READ, времянка которого на той самой Figure 8-2 про которую вы три раза упомянули) бит ACK передает slave, а не master. Мастер в этом такте принимает/проверяет этот бит и у него SDA=high, т.е. отключен, т.к. выход open-drain. Поэтому нет никакой проблемы в том, чтобы сразу после приема ACK сделать для SDA переход high->low, создав условие для restart.
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
sergeeff Jr.
сообщение Nov 24 2010, 19:44
Сообщение #22


Знающий
****

Группа: Свой
Сообщений: 568
Регистрация: 8-07-07
Из: Занзибар
Пользователь №: 28 964



Так ACK это ноль и поэтому SDA остается в нуле... Что-то сам уже потерял уверенность... smile.gif


--------------------
"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 24 2010, 19:58
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(sergeeff Jr. @ Nov 25 2010, 00:44) *
Так ACK это ноль и поэтому SDA остается в нуле... Что-то сам уже потерял уверенность... smile.gif
Вот-вот, то SCL в нуле, то SDA в нуле smile.gif Естественно, что SDA примет значение high (EEPROM освободит линию SDA) только после приема 9-го бита, т.е. когда произойдет переход SCL low->high. Судя по описанию в UG, это так и должно происходить автоматом когда USI работает в режиме master. Но вы свои исходники секретите и поэтому о том, как именно у вас происходит прием/проверка ACK приходится только догадываться. laughing.gif
Go to the top of the page
 
+Quote Post
sergeeff Jr.
сообщение Nov 24 2010, 20:10
Сообщение #24


Знающий
****

Группа: Свой
Сообщений: 568
Регистрация: 8-07-07
Из: Занзибар
Пользователь №: 28 964



case 2: // Receive Address Ack/Nack bit
USICTL0 &= ~USIOE; // SDA = input
USICNT |= 0x01; // Bit counter=1, receive (N)Ack bit

I2C_State = 4; // Go to next state: check (N)Ack
break;

case 4: // Process Address Ack/Nack & handle data TX

if(Transmit == 1){
USICTL0 |= USIOE; // SDA = output
if (USISRL & 0x01) // If Nack received...
{ // Send stop...
USISRL = 0x00;
USICNT |= 0x01; // Bit counter=1, SCL high, SDA low
I2C_State = 14; // Go to next state: generate Stop
P1OUT |= 0x01; // Turn on LED: error
}
else
{ // Ack received, TX data to slave...
USISRL = MST_Data++; // Load data byte
USICNT |= 0x08; // Bit counter = 8, start TX
I2C_State = 10; // next state: receive data (N)Ack
Bytecount++;
P1OUT &= ~0x01; // Turn off LED
break;
}
} if(Transmit == 0){

if (USISRL & 0x01) // If Nack received
{ // Prep Stop Condition
USICTL0 |= USIOE;
USISRL = 0x00;
USICNT |= 0x01; // Bit counter= 1, SCL high, SDA low
I2C_State = 8; // Go to next state: generate Stop
P1OUT |= 0x01; // Turn on LED: error
}
else{ Data_RX();} // Ack received


}
break;



--------------------
"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 24 2010, 22:58
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Это фрагмент, который вы вырезали из примера? Зачем мне этот огрызок исходника? Я же прошу у вас тот исходник, с которым вы сами работаете и в котором у вас не идет "рандомное" чтение EEPROM. Я не имею ни времени, ни особого желания дописывать за вас недостающие части программы и оформлять все это в отдельный проект только для того, чтобы проверить мои/ваши догадки. Если хотите реальной помощи, то выкладывайте готовый/законченный (не)работающий проект или исходник, который можно легко скомпилировать и проверять. Без необходимости "допиливания" его вручную.
Go to the top of the page
 
+Quote Post
sergeeff Jr.
сообщение Nov 24 2010, 23:24
Сообщение #26


Знающий
****

Группа: Свой
Сообщений: 568
Регистрация: 8-07-07
Из: Занзибар
Пользователь №: 28 964



Цитата(rezident @ Nov 24 2010, 09:43) *
Нифига там не понятно. Вы бы еще в микроскоп предложили эти картинки рассматривать. sad.gif Как вы ACK на аппаратный адрес EEPROM получаете? Фрагмент кода приведите.
Почему не можете? Ведь изменение SDA во время SCL=high как раз и создает старт- или стоп-условие.

Вы меня сами попросили привести пример кода "как я ACK на аппаратный адрес EEPROM получаю". Я привел.

Кстати как I2C без железки проверять я не знаю. Как Вы собираетесь код (тот который компилируется) проверять? У этого мк вообще I2C не работает, когда debugger используется (порты имеют несколько функций - или это или то).


--------------------
"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 24 2010, 23:33
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Извините, но при таком диалоге телепата с партизаном мне становится уже неинтересно. Спокойной ночи.
Go to the top of the page
 
+Quote Post
sergeeff Jr.
сообщение Nov 25 2010, 00:11
Сообщение #28


Знающий
****

Группа: Свой
Сообщений: 568
Регистрация: 8-07-07
Из: Занзибар
Пользователь №: 28 964



Спокойной ночи. (а кода у меня с собой просто нет)

То есть еще раз: я взял готовый пример (msp430x20x3_usi_12.c) и слепил из него (один в один), а REPEATED START я сделать не смог. Нет его (как мне кажется) и в примере msp430x20x3_usi_16.c, хотя они это и называют REPEATED START.

Что тут партизанить я не знаю (а коды у меня все на работе).


--------------------
"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие
Go to the top of the page
 
+Quote Post
sergeeff Jr.
сообщение Nov 27 2010, 15:56
Сообщение #29


Знающий
****

Группа: Свой
Сообщений: 568
Регистрация: 8-07-07
Из: Занзибар
Пользователь №: 28 964



А кто-нибудь изучал поведение I2C реализаций в коде (в смысле SOFT I2C)? Насколько там по времени потеря в сравнении (в зависимости от частоты конечно)?

Сообщение отредактировал sergeeff Jr. - Nov 27 2010, 17:24


--------------------
"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие
Go to the top of the page
 
+Quote Post
нечитатель
сообщение Nov 28 2010, 15:36
Сообщение #30


Местный
***

Группа: Участник
Сообщений: 235
Регистрация: 20-11-10
Пользователь №: 61 032



На всякий случай.
Уже ушёл.

(в процессе железной отладки не забывать почаще вкл/выкл питание EEPROM; это сугубо добровольно, но когда надоест тупить в непонятные глюки "один раз случайно сработало, потом навсегда перестало"...)

Сообщение отредактировал нечитатель - Nov 28 2010, 15:40
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 2nd July 2025 - 10:49
Рейтинг@Mail.ru


Страница сгенерированна за 0.01636 секунд с 7
ELECTRONIX ©2004-2016