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

 
 
 
Reply to this topicStart new topic
> Аппартаный TWI AT91SAM7X
LoLo
сообщение Apr 21 2011, 10:52
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 22-12-08
Пользователь №: 42 664



Аппартаный TWI настроен без прерываний.

Код посылки байта:

int TWI_Write(unsigned char address,//FM24V10_ADDRESS
unsigned int iaddress, // Адрес по которому записать
unsigned int isize, // Размер внутреннего адреса ведомого устрйоства AT91C_TWI_IADRSZ_2_BYTE
unsigned char *pData, // Указатель на данные, которые нада записать
unsigned int num) // Количество байт для записи
{
unsigned int status, err=0, Counter=0;
// Set internal address bytes
AT91C_BASE_TWI->TWI_IADR = 0;
AT91C_BASE_TWI->TWI_IADR = iaddress;

// Set slave address and number of internal address bytes
AT91C_BASE_TWI->TWI_MMR = 0;
AT91C_BASE_TWI->TWI_MMR = isize;
AT91C_BASE_TWI->TWI_MMR = (isize | (address << 16)) & ~AT91C_TWI_MREAD;

AT91C_BASE_TWI->TWI_THR=*pData;
AT91C_BASE_TWI->TWI_CR = AT91C_TWI_START | AT91C_TWI_STOP | AT91C_TWI_MSEN;
status = AT91C_BASE_TWI->TWI_SR;
while (!(status & AT91C_TWI_TXRDY))
{
status = AT91C_BASE_TWI->TWI_SR;
//************************************
if ((status & AT91C_TWI_NACK) == AT91C_TWI_NACK)
{
err++;
}
}
.......

Происходят 2 вещи:
1. Цикл while почему-то виснит. Зацикливается.
2. Если поставить небольшую задержку в место отмеченное //******************
то вроде проходит нормально, но имеются err, хотя запись происходит ВЕРНО!

Что не верно???

Go to the top of the page
 
+Quote Post
DmitryM
сообщение Apr 22 2011, 05:21
Сообщение #2


Знающий
****

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



Цитата(LoLo @ Apr 21 2011, 14:52) *
AT91C_BASE_TWI->TWI_THR=*pData;
AT91C_BASE_TWI->TWI_CR = AT91C_TWI_START | AT91C_TWI_STOP | AT91C_TWI_MSEN;
status = AT91C_BASE_TWI->TWI_SR;
while (!(status & AT91C_TWI_TXRDY))
{
status = AT91C_BASE_TWI->TWI_SR;
//************************************
if ((status & AT91C_TWI_NACK) == AT91C_TWI_NACK)
{
err++;
}
}


см. datasheet:
• START: Send a START Condition
0 = No effect.
1 = A frame beginning with a START bit is transmitted according to the features defined in the mode register.
This action is necessary when the TWI peripheral wants to read data from a slave. When configured in Master Mode with a
write operation, a frame is sent with the mode register as soon as the user writes a character in the holding register.

Нужно поменять местами:
AT91C_BASE_TWI->TWI_CR = AT91C_TWI_START | AT91C_TWI_STOP | AT91C_TWI_MSEN;
AT91C_BASE_TWI->TWI_THR=*pData;

Ну и еще раз обратите внимание на еррату по поводу NACK!!!
Go to the top of the page
 
+Quote Post
LoLo
сообщение Apr 22 2011, 06:09
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 22-12-08
Пользователь №: 42 664



Цитата(DmitryM @ Apr 22 2011, 09:21) *
см. datasheet:
• START: Send a START Condition
0 = No effect.
1 = A frame beginning with a START bit is transmitted according to the features defined in the mode register.
This action is necessary when the TWI peripheral wants to read data from a slave. When configured in Master Mode with a
write operation, a frame is sent with the mode register as soon as the user writes a character in the holding register.

Нужно поменять местами:
AT91C_BASE_TWI->TWI_CR = AT91C_TWI_START | AT91C_TWI_STOP | AT91C_TWI_MSEN;
AT91C_BASE_TWI->TWI_THR=*pData;

Ну и еще раз обратите внимание на еррату по поводу NACK!!!


Пробовал менять местами. Все тоже самое.
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Apr 22 2011, 06:51
Сообщение #4


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

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



В приложении - кусок, работавший. В него "надёргано" атмеловских функций, в конце - чтение какой-то епромины.
Go to the top of the page
 
+Quote Post
LoLo
сообщение Apr 22 2011, 07:36
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 22-12-08
Пользователь №: 42 664



Цитата(Genadi Zawidowski @ Apr 22 2011, 10:51) *
В приложении - кусок, работавший. В него "надёргано" атмеловских функций, в конце - чтение какой-то епромины.


из Вашего кода:
функция unsigned char TWID_Write(...)
...
while( !TWI_TransferComplete(pTwi) && (++timeout<TWITIMEOUTMAX) );
if (timeout == TWITIMEOUTMAX) {
dbg_puts_impl("TWID Timeout TC2\n\r");
}

В функции посылки unsigned char TWID_Write(...) при посылке 1 байта по сути таже самая проверка

TWI_TransferComplete(pTwi), только еще таймаут проверяется, когда досчитает до TWITIMEOUTMAX 50000
Соответственно скорее всего будет выходить по таймауту.
А откуда это взяли, что нада еще вводить этот таймаут?

Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Apr 22 2011, 08:23
Сообщение #6


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

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Цитата(LoLo @ Apr 22 2011, 10:36) *
из Вашего кода:
А откуда это взяли, что нада еще вводить этот таймаут?


Честно скажу - код взят совмещением в одном файле атмеловских кусков, проверялось (и работало) на начальных этапах разработки - и в конечный вариант не пошло (TWI из проекта испарился).
Со странностями не разбирался, сказать ничего не могу.
Вам советую убедиться, что работает с вашим слейвом, потом уже начинать переделки и разбинательства.
На первый взгляд - просто защита от неподключённого устройства, дабы не висеть вечно.

Сообщение отредактировал Genadi Zawidowski - Apr 22 2011, 08:24
Go to the top of the page
 
+Quote Post
DmitryM
сообщение Apr 22 2011, 12:43
Сообщение #7


Знающий
****

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



Цитата(Genadi Zawidowski @ Apr 22 2011, 12:23) *
На первый взгляд - просто защита от неподключённого устройства, дабы не висеть вечно.
Дык обычно выход по NACK.

Цитата(LoLo @ Apr 22 2011, 10:09) *


AT91C_BASE_TWI->TWI_MMR = ((isize&3)<<8 | ((address&0x7F) << 16)) & ~AT91C_TWI_MREAD;
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 25th June 2025 - 13:03
Рейтинг@Mail.ru


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