Всем привет.
Столкнулся с проблемой подключения моей 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;
}