AT91SAM7 старт с коленки
Привет радиокотам на базе ARM. Нужна помощь, чтобы разобраться с SPI интерфейсом. Решил тут подключить дисплей от нокии PCD8544 к SPI0 и тут же возникли баги. Дисплей молчит как рыба. У меня сто процентная уверенность что я неправильно работую с интерфейсом. Выкладываю код "keil":
- Реклама
Народ мож кто сталкивался с проблемой, что при отправке данных в SPI, некоторые из них не проходили.
У меня такая проблема, шлю данные в дисплей, он не запускается. Ладно. Начинаю вручную отлаживать - F11, данные начинают выходить и дисплей нормально запускается. Пробовал ставить задержки в секунду!!! Такая-же байда. У кого есть идеи?
У меня такая проблема, шлю данные в дисплей, он не запускается. Ладно. Начинаю вручную отлаживать - F11, данные начинают выходить и дисплей нормально запускается. Пробовал ставить задержки в секунду!!! Такая-же байда. У кого есть идеи?
Уважаемый, neonix, в первой строчке кода Вы инициализируете порт в/в как структуру? не могли бы прокомментировать? я новичекneonix писал(а):ELcat я бы такое не оставил бы для будущих поколений...Код: Выделить всё
.... int main(void) { AT91PS_PIO pPIOA = AT91C_BASE_PIOA; AT91PS_PMC pPMC = AT91C_BASE_PMC; pPMC->PMC_PCER = (1 << AT91C_ID_PIOA ); //Включаем тактирование PIOA pPIOA->PIO_OER = AT91C_PIO_PA1 | AT91C_PIO_PA2; ....
Ставим плюсы: )
- Сообщения: 1040
- Зарегистрирован: Чт фев 19, 2009 17:46:34
Вся периферия в стандартной библиотеке представлена структурами, кроме того для каждой переферии есть адреса в карте памяти SAM7S.
AT91PS_PIO - это указатель на структуру AT91S_PIO которой мы присваиваем адрес контроллера питания AT91C_BASE_PIOA.
Можно выполнить ту же самую задачу с помощью инлайн функции из библиотеки.
Но в инлайн функциях есть куча багов и недоработок, поэтому их использование может быть чревато.
AT91PS_PIO - это указатель на структуру AT91S_PIO которой мы присваиваем адрес контроллера питания AT91C_BASE_PIOA.
Можно выполнить ту же самую задачу с помощью инлайн функции из библиотеки.
Код: Выделить всё
AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOA) ;Where technology meets enjoyment.
pPIOA это что такое ? только начинаю, разбиратьсяibiza11 писал(а):Уважаемый, neonix, в первой строчке кода Вы инициализируете порт в/в как структуру? не могли бы прокомментировать? я новичекneonix писал(а):ELcat я бы такое не оставил бы для будущих поколений...Код: Выделить всё
.... int main(void) { AT91PS_PIO pPIOA = AT91C_BASE_PIOA; AT91PS_PMC pPMC = AT91C_BASE_PMC; pPMC->PMC_PCER = (1 << AT91C_ID_PIOA ); //Включаем тактирование PIOA pPIOA->PIO_OER = AT91C_PIO_PA1 | AT91C_PIO_PA2; ....
- Реклама
Указатель на структуру, содержащую регистры порта ввода-вывода A, судя по всему.pPIOA это что такое ? только начинаю, разбираться
Последний раз редактировалось SII Вт апр 12, 2011 02:00:21, всего редактировалось 1 раз.
а так можнаVictor Gordienko писал(а):pPIOA это что такое ? только начинаю, разбиратьсяibiza11 писал(а): Уважаемый, neonix, в первой строчке кода Вы инициализируете порт в/в как структуру? не могли бы прокомментировать? я новичек
AT91PS_PIO pPIOA;
pPIOA->PIO_OER = AT91C_PIO_PA1 | AT91C_PIO_PA2;
Как обявить прерывание по нажатию кнопки у AT91SAM7 ?
Кнопка заведена на какую-нибудь из ног микроконтроллера. Значит, нужно настроить эту самую ногу как вход (возможно, с включенной подтяжкой) и с генерацией запроса прерывания при изменении состояния. Как конкретно, нужно смотреть документацию на PIO. Ну а как объявить в программе, это я уже не знаю: на Си не пишу. Но сразу скажу, что там довольно много чего делать придётся, ведь запросы прерываний от периферии сначала поступают на контроллер прерываний (у АТМЕЛовских АРМов он называется AIC), а значит, для начала нужно правильным образом настроить его.
У кого есть пример работы с USB для AT91SAM7 ?
Есть у сайта атмела.Victor Gordienko писал(а):У кого есть пример работы с USB для AT91SAM7 ?
Оу, что то там сложновато ((( ..... нет по русски ничего ?Stepan писал(а):вот ссыльSatyr писал(а): Есть у сайта атмела.
Помогити с прерыванием по приему UART, 1 раз работает нормально, заходит в прерывание, но уже 2 раз нет (
вот код :
#include "AT91SAM7S64.h"
#define SW (pPIO->PIO_PDSR)
#define LED0 (1<<0) // PA0
#define LED1 (1<<1) // PA1
#define LED2 (1<<2) // PA2
#define LED3 (1<<3) // PA3
#define SW0 (1<<19) // PA19
#define SW1 (1<<20) // PA20
#define SW2 (1<<15) // PA15
#define SW3 (1<<14) // PA14
#define LED_MASK (LED0|LED1|LED3)
#define EXT_OC 18432000 // External Oscillator MAINCK
#define MCK 47923200 // MCK (PLLRC div by 2)
#define MCKKHz (MCK/1000) // MCK in kHz
#define BR 115200 /* Baud Rate */
#define BRD (MCK/16/BR) /* Baud Rate Divisor */
void Usart_c_irq_handler(void);
void init_serial_pc (void);
AT91S_USART * pUSART1 = AT91C_BASE_US1; /* Global Pointer to USART0 */
AT91PS_AIC pAIC = AT91C_BASE_AIC;
AT91PS_PIO pPIO = AT91C_BASE_PIOA;
void init_serial_pc (void)
{ /* Initialize Serial Interface */
pAIC->AIC_IDCR=1<<AT91C_ID_US1;
pAIC->AIC_SVR[AT91C_ID_US1] = (unsigned int) Usart_c_irq_handler ;
pAIC->AIC_SMR[AT91C_ID_US1] = AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL | 1;
pAIC->AIC_ICCR=1<<AT91C_ID_US1;
AT91C_BASE_US1->US_IER = (0x1 << 0);
pAIC->AIC_IECR = 1<<AT91C_ID_US1;
AT91C_BASE_US1->US_TTGR = 0;
*AT91C_PIOA_PDR = AT91C_PA21_RXD1 | /* Enable RxD0 Pin */
AT91C_PA22_TXD1; /* Enalbe TxD0 Pin */
pUSART1->US_CR =AT91C_US_RSTRX | /* Reset Receiver */
AT91C_US_RSTTX | /* Reset Transmitter */
AT91C_US_RXDIS | /* Receiver Disable */
AT91C_US_TXDIS; /* Transmitter Disable */
pUSART1->US_MR =AT91C_US_USMODE_NORMAL | /* Normal Mode */
AT91C_US_CLKS_CLOCK | /* Clock = MCK */
AT91C_US_CHRL_8_BITS | /* 8-bit Data */
AT91C_US_PAR_NONE | /* No Parity */
AT91C_US_NBSTOP_1_BIT; /* 1 Stop Bit */
pUSART1->US_BRGR = BRD; /* Baud Rate Divisor */
pUSART1->US_CR =AT91C_US_RXEN | /* Receiver Enable */
AT91C_US_TXEN; /* Transmitter Enable */
}
int sendchar (int ch)
{ /* Write character to Serial Port */
if (ch == '\n') { /* Check for CR */
while (!(pUSART1->US_CSR & AT91C_US_TXRDY)); /* Wait for Empty Tx Buffer */
pUSART1->US_THR = '\r'; /* Output CR */
}
while (!(pUSART1->US_CSR & AT91C_US_TXRDY)); /* Wait for Empty Tx Buffer */
return (pUSART1->US_THR = ch); /* Transmit Character */
}
int getkey_pc (void)
{ /* Read character from Serial Port */
while (!(pUSART1->US_CSR & AT91C_US_RXRDY)); /* Wait for Full Rx Buffer */
return (pUSART1->US_RHR); /* Read Character */
}
void Usart_c_irq_handler(void)
{
unsigned int status;
char data;
status = AT91C_BASE_US1 -> US_CSR ;
status &= AT91C_BASE_US1 -> US_IMR;
if (status & AT91C_US_RXRDY)
{
pPIO->PIO_CODR = LED1;
data=getkey_pc();
sendchar(data);
}
pPIO->PIO_CODR = LED3;
}
int main(void)
{
*AT91C_PMC_PCER = (1<<AT91C_ID_US1)|(1 <<AT91C_ID_PIOA);
init_serial_pc ();
pPIO->PIO_PER = LED_MASK;
pPIO->PIO_OER = LED_MASK;
pPIO->PIO_SODR = LED_MASK;
while (1)
{
}
}
вот код :
#include "AT91SAM7S64.h"
#define SW (pPIO->PIO_PDSR)
#define LED0 (1<<0) // PA0
#define LED1 (1<<1) // PA1
#define LED2 (1<<2) // PA2
#define LED3 (1<<3) // PA3
#define SW0 (1<<19) // PA19
#define SW1 (1<<20) // PA20
#define SW2 (1<<15) // PA15
#define SW3 (1<<14) // PA14
#define LED_MASK (LED0|LED1|LED3)
#define EXT_OC 18432000 // External Oscillator MAINCK
#define MCK 47923200 // MCK (PLLRC div by 2)
#define MCKKHz (MCK/1000) // MCK in kHz
#define BR 115200 /* Baud Rate */
#define BRD (MCK/16/BR) /* Baud Rate Divisor */
void Usart_c_irq_handler(void);
void init_serial_pc (void);
AT91S_USART * pUSART1 = AT91C_BASE_US1; /* Global Pointer to USART0 */
AT91PS_AIC pAIC = AT91C_BASE_AIC;
AT91PS_PIO pPIO = AT91C_BASE_PIOA;
void init_serial_pc (void)
{ /* Initialize Serial Interface */
pAIC->AIC_IDCR=1<<AT91C_ID_US1;
pAIC->AIC_SVR[AT91C_ID_US1] = (unsigned int) Usart_c_irq_handler ;
pAIC->AIC_SMR[AT91C_ID_US1] = AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL | 1;
pAIC->AIC_ICCR=1<<AT91C_ID_US1;
AT91C_BASE_US1->US_IER = (0x1 << 0);
pAIC->AIC_IECR = 1<<AT91C_ID_US1;
AT91C_BASE_US1->US_TTGR = 0;
*AT91C_PIOA_PDR = AT91C_PA21_RXD1 | /* Enable RxD0 Pin */
AT91C_PA22_TXD1; /* Enalbe TxD0 Pin */
pUSART1->US_CR =AT91C_US_RSTRX | /* Reset Receiver */
AT91C_US_RSTTX | /* Reset Transmitter */
AT91C_US_RXDIS | /* Receiver Disable */
AT91C_US_TXDIS; /* Transmitter Disable */
pUSART1->US_MR =AT91C_US_USMODE_NORMAL | /* Normal Mode */
AT91C_US_CLKS_CLOCK | /* Clock = MCK */
AT91C_US_CHRL_8_BITS | /* 8-bit Data */
AT91C_US_PAR_NONE | /* No Parity */
AT91C_US_NBSTOP_1_BIT; /* 1 Stop Bit */
pUSART1->US_BRGR = BRD; /* Baud Rate Divisor */
pUSART1->US_CR =AT91C_US_RXEN | /* Receiver Enable */
AT91C_US_TXEN; /* Transmitter Enable */
}
int sendchar (int ch)
{ /* Write character to Serial Port */
if (ch == '\n') { /* Check for CR */
while (!(pUSART1->US_CSR & AT91C_US_TXRDY)); /* Wait for Empty Tx Buffer */
pUSART1->US_THR = '\r'; /* Output CR */
}
while (!(pUSART1->US_CSR & AT91C_US_TXRDY)); /* Wait for Empty Tx Buffer */
return (pUSART1->US_THR = ch); /* Transmit Character */
}
int getkey_pc (void)
{ /* Read character from Serial Port */
while (!(pUSART1->US_CSR & AT91C_US_RXRDY)); /* Wait for Full Rx Buffer */
return (pUSART1->US_RHR); /* Read Character */
}
void Usart_c_irq_handler(void)
{
unsigned int status;
char data;
status = AT91C_BASE_US1 -> US_CSR ;
status &= AT91C_BASE_US1 -> US_IMR;
if (status & AT91C_US_RXRDY)
{
pPIO->PIO_CODR = LED1;
data=getkey_pc();
sendchar(data);
}
pPIO->PIO_CODR = LED3;
}
int main(void)
{
*AT91C_PMC_PCER = (1<<AT91C_ID_US1)|(1 <<AT91C_ID_PIOA);
init_serial_pc ();
pPIO->PIO_PER = LED_MASK;
pPIO->PIO_OER = LED_MASK;
pPIO->PIO_SODR = LED_MASK;
while (1)
{
}
}
сбросить прерывание забыл
Я так понял нужно добавить AT91C_BASE_AIC->AIC_EOICR = 0;romazan писал(а):сбросить прерывание забыл
или нет ?
void Usart_c_irq_handler(void)
{
unsigned int status;
char data;
status = AT91C_BASE_US1 -> US_CSR ;
status &= AT91C_BASE_US1 -> US_IMR;
if (status & AT91C_US_RXRDY)
{
pPIO->PIO_CODR = LED1;
data=getkey_pc();
sendchar(data);
}
pPIO->PIO_CODR = LED3;
AT91C_BASE_AIC->AIC_EOICR = 0;
}
Так само работает только один раз (
Что никто не поможет ?
AT91C_BASE_AIC->AIC_EOICR = AT91C_BASE_US1 -> US_CSR
romazan, разобрались с проблемой со SPI?
а то, похоже, у меня та же байда: SD карточка на SPI не инициализируется, если запускаю дебаг - всё работает (програмный ресет с верификацией после подачи питания тоже помогает). Паузы перед инициализацией SDшки не помогают.
а то, похоже, у меня та же байда: SD карточка на SPI не инициализируется, если запускаю дебаг - всё работает (програмный ресет с верификацией после подачи питания тоже помогает). Паузы перед инициализацией SDшки не помогают.
меньше слов - больше дела


