|
|
  |
Twi в SAM7s128, он же I2C |
|
|
|
Sep 10 2009, 14:10
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Nikitoc @ Sep 10 2009, 17:30)  Подскажите, где я делаю что-то неправильно? - читаете write only регистры Код pPIO -> PIO_PDR = pPIO -> PIO_PDR | 0x18; // disable PA3 PA4 I/O for using by I2C - используете безымянные константы, что потенциально может привести к ошибкам Посмотрите еще эту и эту темы, и подумайте, надо ли Вам вообще это счастье. Для себя я решил однозначно, что пользоваться TWI на SAM7S и SAM7X не стоит.
|
|
|
|
|
Sep 10 2009, 15:26
|

Участник

Группа: Участник
Сообщений: 67
Регистрация: 8-05-09
Из: Томск
Пользователь №: 48 809

|
Цитата(aaarrr @ Sep 10 2009, 21:10)  Для себя я решил однозначно, что пользоваться TWI на SAM7S и SAM7X не стоит. Аналогично - пробовал реализовать аппаратный TWI на sam7s64, в результате реализовал вручную все - разбираться, что не так работало просто не было времени.
|
|
|
|
|
Sep 11 2009, 11:40
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(DmitryM @ Sep 11 2009, 08:31)  Камень AT91SAM7S64. Периферия TLV320AIC20, LM8333, FM1073V23. Используется аппаратный TWI, прекрасно работает. Обработчик по прерываниям. Рад за вас, Вам повезло. Цитата(DmitryM @ Sep 11 2009, 08:31)  Весьма странно, что бытует мнение о неработоспособном TWI в SAM'ах. А для тех, кому не так повезло, Атмел сочинил чудный документ, в котором, например, предлагается решать проблему зависания шины добавлением транзисторов, коммутирующих питание слейвов (стр.7), и убить себя об стену ничего не делать, если в системе есть слейвы, использующие clock stretching (стр.27-28). И пусть каждый сам для себя решает, продолжать ли ему есть кактус использовать TWI, добавляя ненужные транзисторы и выбирая "подходящие" слейвы, или просто заменить драйвер на bit-bang. Кстати, в линуксовом кернеле так и поступили.
|
|
|
|
|
Sep 12 2009, 16:00
|
Группа: Участник
Сообщений: 6
Регистрация: 11-11-08
Пользователь №: 41 537

|
Nikitoc Вы неправильно делаете инициализацию TWI. Вот пример как я инициализировал:
#include <AT91SAM7S256.H> #include <lib_AT91SAM7S256.H> #include "..\Main\main.h"
#define SPEED_I2C 200000 // Частота работы шины I2C в Гц. #define CLKDIV (MAINCLK/(2*SPEED_I2C)-3) // Не должен быть выше 255 или меньше 0
//---------------------------------------------------------------------------- void i2c_init (void) { AT91F_TWI_CfgPIO(); // Подключаем TWI к выходам PA3 и PA4 *AT91C_PIOA_PPUDR = (AT91C_PA4_TWCK | AT91C_PA3_TWD); // Отключаем внутренние подтягивающие резисторы *AT91C_PIOA_MDER = (AT91C_PA4_TWCK | AT91C_PA3_TWD); // Включаем режим управления - открытый коллектор AT91F_TWI_CfgPMC(); // Разрешим тактирование TWI AT91F_TWI_Configure(AT91C_BASE_TWI); // Отключаем все прерывания, делаем сброс TWI и устанавливаем в режим мастера *AT91C_TWI_CWGR = ((0x00 << 16) | (CLKDIV << 8) | (CLKDIV)); *AT91C_TWI_MMR = 0; // Устанавливаем 0 адрес Slave; режим записи; не использование адресации внутренних регистров slave device }
//---------------------------------------------------------------------------- void i2c_write_byte(char value) { int Status; *AT91C_TWI_MMR &= ~AT91C_TWI_MREAD; // Установим режим записи *AT91C_TWI_CR = AT91C_TWI_START | AT91C_TWI_STOP | AT91C_TWI_MSEN; *AT91C_TWI_THR = value; // Записываем данные в регистр передачи, тем самым запуская передачу Status = *AT91C_TWI_SR; // Читаем регистр статуса while (!(Status & AT91C_TWI_TXCOMP)) Status = *AT91C_TWI_SR; // Ждем завершения передачи }
|
|
|
|
|
Sep 12 2009, 16:52
|

Частый гость
 
Группа: Свой
Сообщений: 169
Регистрация: 17-09-07
Из: Красноярск
Пользователь №: 30 600

|
Цитата(aaarrr @ Sep 11 2009, 02:21)  По первой ссылке. Вариант дебильный, конечно, но вполне работоспособен. Используйте на здоровье. Ничуть не дибильный, на 60кгц работал без особых затей. Я разве что подогнул обработку очереди чётотам_poll за один вызов
|
|
|
|
|
Sep 21 2009, 11:21
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 18-05-06
Пользователь №: 17 226

|
А в SAM9 которые ARM926 - там как дело с TWI обстоит? надеюсь атмелы исправили ошибки.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|