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

daniyal

Участник
  • Постов

    5
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный
  1. Здравствуйте, с адресом ошибся, адрес устройства(дисплея) = 0х70, но это не помогло. В даташите есть схема алгоритма записи в режиме ведущего и описание, там сказано, что только после записи START начинается передача данных, после STOP - заканчивается.
  2. Назовите Вашу цену за эту работу.
  3. Может быть кто-нибудь сможет написать драйвер под этот дисплей за Рубли? :excl: :excl: :excl:
  4. Всем привет. Столкнулся с проблемой подключения моей AT91SAM7S256(на плате SAM7-P256 от Olimex) к LCD-дисплею(LCD-MOD-1x9 от Olimex) по TWI. Пошарив инет + даташит, я собрал примерно рабочий код, при отладке в Keil 5 по шине TWI отправляется данные, но LCD не хочет включаться или я что-то делаю не так. Подскажите что делать , заранее спасибо! #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; }
  5. Всем привет. Столкнулся с проблемой подключения моей AT91SAM7S256(на плате SAM7-P256 от Olimex) к LCD-дисплею(LCD-MOD-1x9 от Olimex) по TWI. Пошарив инет + даташит, я собрал примерно рабочий код, при отладке в Keil 5 по шине TWI отправляется байты, но LCD не хочет включаться или я что-то делаю не так. Подскажите что делать, заранее спасибо! #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; }
×
×
  • Создать...