Перейти к содержанию
    

AT91SAM7S, Подключение LCD по TWI

Всем привет.

Столкнулся с проблемой подключения моей AT91SAM7S256(на плате SAM7-P256 от Olimex) к LCD-дисплею(LCD-MOD-1x9 от Olimex) по TWI.

Пошарив инет + даташит, я собрал примерно рабочий код, при отладке в Keil 5 по шине TWI отправляется данные, но LCD не хочет включаться или я что-то делаю не так.

Подскажите что делать :help: , заранее спасибо!

 

#include "AT91SAM7S256.h" // Definitions of the ARM chip and on-chip peripherals.
#include "SAM7-P256.h"	// Definitions of peripherals on the Olimex dev board.
#include "Board.h"

#define SPEED_I2C 100000 // Частота работы шины I2C в Гц.
#define CLKDIV (MCK/(2*SPEED_I2C)-3) // Не должен быть выше 255 или меньше 0

void i2c_write_byte(char value)
{
int Status;

*AT91C_TWI_MMR &= ~AT91C_TWI_MREAD; //Установим режим записи
*AT91C_TWI_THR = value; //  Записываем данные в регистр передачи, тем самым запуская передачу
*AT91C_TWI_CR = AT91C_TWI_START;
Status = *AT91C_TWI_SR; // Читаем регистр статуса
while (!(Status & AT91C_TWI_TXCOMP)) 
	Status = *AT91C_TWI_SR; // Ждем завершения передачи
*AT91C_TWI_CR = AT91C_TWI_STOP;
}

void AT91F_TWI_CfgPIO (void)
{
*AT91C_PIOA_ASR = 0x18; //назначаем для PA3,PA4 канал А
*AT91C_PIOA_BSR = 0x0;
*AT91C_PIOA_PDR = (0x18 | 0x0); //контролируется переф. устройством
}

void AT91F_PMC_EnablePeriphClock (
AT91PS_PMC pPMC, // \arg pointer to PMC controller
unsigned int periphIds)  // \arg IDs of peripherals
{
pPMC->PMC_PCER = periphIds;
}

void AT91F_TWI_CfgPMC (void)
{
AT91F_PMC_EnablePeriphClock(
	AT91C_BASE_PMC, // PIO controller base address
	((unsigned int) 1 << AT91C_ID_TWI));
}


void AT91F_TWI_Configure ( AT91PS_TWI pTWI )		  // \arg pointer to a TWI controller
{
//* Disable interrupts
pTWI->TWI_IDR = (unsigned int) -1;

//* Reset peripheral
pTWI->TWI_CR = AT91C_TWI_SWRST;

//* Set Master mode
pTWI->TWI_CR = AT91C_TWI_MSEN;

}

int main()
{
char i;

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 = 0x0;//Устанавливаем 0 адрес Slave; режим записи; не использование адресации внутренних регистров slave device


	//эта часть взята с официального сайта Olimex, там есть пример для arduino
	//предполагается, что эти строки инициализируют LCD и подсвечивают все сегменты
i2c_write_byte(0x70 | 0x00);
i2c_write_byte(0xC8); // mode register
i2c_write_byte(0xF0); // blink register
i2c_write_byte(0xE0); // device select register
i2c_write_byte(0x00); // pointer register

	// light up all the segments, initialize the local display buffer as well
for(i = 0; i < 20; i++)
{
	i2c_write_byte(0xFF);
}

while(1);

return 0;
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может быть кто-нибудь сможет написать драйвер под этот дисплей за Рубли? :excl: :excl: :excl:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может быть кто-нибудь сможет написать драйвер под этот дисплей за Рубли? :excl: :excl: :excl:

А сколько их у Вас есть?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По-моему вот это:

*AT91C_TWI_CR = AT91C_TWI_START;

*AT91C_TWI_CR = AT91C_TWI_STOP;

при работе мастера на передачу - не требуется.

 

И Вы уверены, что адрес контроллера на шине I2C равен 0x0??? Уточните этот момент в документации...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По-моему вот это:

*AT91C_TWI_CR = AT91C_TWI_START;

*AT91C_TWI_CR = AT91C_TWI_STOP;

при работе мастера на передачу - не требуется.

 

И Вы уверены, что адрес контроллера на шине I2C равен 0x0??? Уточните этот момент в документации...

 

Здравствуйте, с адресом ошибся, адрес устройства(дисплея) = 0х70, но это не помогло.

В даташите есть схема алгоритма записи в режиме ведущего и описание, там сказано, что только после записи START начинается передача данных, после STOP - заканчивается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И Вы уверены, что адрес контроллера на шине I2C равен 0x0??? Уточните этот момент в документации...

Вроде как 0 - это широковещательный адрес для I2C. Так что если устройство одно на шине - допустимо.

Хотя может какие-то устройства его не поддерживают?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...