AT91SAM7 старт с коленки
- romazan
- Потрогал лапой паяльник
- Сообщения: 335
- Зарегистрирован: Чт май 21, 2009 13:54:07
- Откуда: Москва
- Контактная информация:
Re: AT91SAM7 старт с коленки
Привет радиокотам на базе ARM. Нужна помощь, чтобы разобраться с SPI интерфейсом. Решил тут подключить дисплей от нокии PCD8544 к SPI0 и тут же возникли баги. Дисплей молчит как рыба. У меня сто процентная уверенность что я неправильно работую с интерфейсом. Выкладываю код "keil":
- romazan
- Потрогал лапой паяльник
- Сообщения: 335
- Зарегистрирован: Чт май 21, 2009 13:54:07
- Откуда: Москва
- Контактная информация:
Re: AT91SAM7 старт с коленки
Народ мож кто сталкивался с проблемой, что при отправке данных в SPI, некоторые из них не проходили.
У меня такая проблема, шлю данные в дисплей, он не запускается. Ладно. Начинаю вручную отлаживать - F11, данные начинают выходить и дисплей нормально запускается. Пробовал ставить задержки в секунду!!! Такая-же байда. У кого есть идеи?
У меня такая проблема, шлю данные в дисплей, он не запускается. Ладно. Начинаю вручную отлаживать - F11, данные начинают выходить и дисплей нормально запускается. Пробовал ставить задержки в секунду!!! Такая-же байда. У кого есть идеи?
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
Re: AT91SAM7 старт с коленки
Уважаемый, 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;
....
Ставим плюсы: )
- neonix
- Электрический кот
- Сообщения: 1040
- Зарегистрирован: Чт фев 19, 2009 17:46:34
- Контактная информация:
Re: AT91SAM7 старт с коленки
Вся периферия в стандартной библиотеке представлена структурами, кроме того для каждой переферии есть адреса в карте памяти 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.
-
inkHunter
- Грызет канифоль
- Сообщения: 287
- Зарегистрирован: Сб авг 21, 2010 20:44:27
- Откуда: Ростов
- Контактная информация:
Re: AT91SAM7 старт с коленки
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;
....
pPIOA это что такое ? только начинаю, разбираться
-
SII
- Вымогатель припоя
- Сообщения: 635
- Зарегистрирован: Пт янв 30, 2009 14:50:35
- Откуда: Солнечногорск
Re: AT91SAM7 старт с коленки
pPIOA это что такое ? только начинаю, разбираться
Указатель на структуру, содержащую регистры порта ввода-вывода A, судя по всему.
Последний раз редактировалось SII Вт апр 12, 2011 02:00:21, всего редактировалось 1 раз.
-
inkHunter
- Грызет канифоль
- Сообщения: 287
- Зарегистрирован: Сб авг 21, 2010 20:44:27
- Откуда: Ростов
- Контактная информация:
Re: AT91SAM7 старт с коленки
Victor Gordienko писал(а):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;
....
pPIOA это что такое ? только начинаю, разбираться
а так можна
AT91PS_PIO pPIOA;
pPIOA->PIO_OER = AT91C_PIO_PA1 | AT91C_PIO_PA2;
-
SII
- Вымогатель припоя
- Сообщения: 635
- Зарегистрирован: Пт янв 30, 2009 14:50:35
- Откуда: Солнечногорск
Re: AT91SAM7 старт с коленки
Нельзя. Сначала надо присвоить начальное значение pPIOA.
-
inkHunter
- Грызет канифоль
- Сообщения: 287
- Зарегистрирован: Сб авг 21, 2010 20:44:27
- Откуда: Ростов
- Контактная информация:
Re: AT91SAM7 старт с коленки
Как обявить прерывание по нажатию кнопки у AT91SAM7 ?
-
SII
- Вымогатель припоя
- Сообщения: 635
- Зарегистрирован: Пт янв 30, 2009 14:50:35
- Откуда: Солнечногорск
Re: AT91SAM7 старт с коленки
Кнопка заведена на какую-нибудь из ног микроконтроллера. Значит, нужно настроить эту самую ногу как вход (возможно, с включенной подтяжкой) и с генерацией запроса прерывания при изменении состояния. Как конкретно, нужно смотреть документацию на PIO. Ну а как объявить в программе, это я уже не знаю: на Си не пишу. Но сразу скажу, что там довольно много чего делать придётся, ведь запросы прерываний от периферии сначала поступают на контроллер прерываний (у АТМЕЛовских АРМов он называется AIC), а значит, для начала нужно правильным образом настроить его.
-
inkHunter
- Грызет канифоль
- Сообщения: 287
- Зарегистрирован: Сб авг 21, 2010 20:44:27
- Откуда: Ростов
- Контактная информация:
Re: AT91SAM7 старт с коленки
У кого есть пример работы с USB для AT91SAM7 ?
Re: AT91SAM7 старт с коленки
Victor Gordienko писал(а):У кого есть пример работы с USB для AT91SAM7 ?
Есть у сайта атмела.
Re: AT91SAM7 старт с коленки
вот ссыльSatyr писал(а): Есть у сайта атмела.
меньше слов - больше дела
-
inkHunter
- Грызет канифоль
- Сообщения: 287
- Зарегистрирован: Сб авг 21, 2010 20:44:27
- Откуда: Ростов
- Контактная информация:
Re: AT91SAM7 старт с коленки
Stepan писал(а):вот ссыльSatyr писал(а): Есть у сайта атмела.
Оу, что то там сложновато ((( ..... нет по русски ничего ?
-
inkHunter
- Грызет канифоль
- Сообщения: 287
- Зарегистрирован: Сб авг 21, 2010 20:44:27
- Откуда: Ростов
- Контактная информация:
Re: AT91SAM7 старт с коленки
Помогити с прерыванием по приему 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)
{
}
}
- romazan
- Потрогал лапой паяльник
- Сообщения: 335
- Зарегистрирован: Чт май 21, 2009 13:54:07
- Откуда: Москва
- Контактная информация:
Re: AT91SAM7 старт с коленки
сбросить прерывание забыл
-
inkHunter
- Грызет канифоль
- Сообщения: 287
- Зарегистрирован: Сб авг 21, 2010 20:44:27
- Откуда: Ростов
- Контактная информация:
Re: AT91SAM7 старт с коленки
romazan писал(а):сбросить прерывание забыл
Я так понял нужно добавить AT91C_BASE_AIC->AIC_EOICR = 0;
или нет ?
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;
}
Так само работает только один раз (
-
inkHunter
- Грызет канифоль
- Сообщения: 287
- Зарегистрирован: Сб авг 21, 2010 20:44:27
- Откуда: Ростов
- Контактная информация:
Re: AT91SAM7 старт с коленки
Что никто не поможет ?
- romazan
- Потрогал лапой паяльник
- Сообщения: 335
- Зарегистрирован: Чт май 21, 2009 13:54:07
- Откуда: Москва
- Контактная информация:
Re: AT91SAM7 старт с коленки
AT91C_BASE_AIC->AIC_EOICR = AT91C_BASE_US1 -> US_CSR
Re: AT91SAM7 старт с коленки
romazan, разобрались с проблемой со SPI?
а то, похоже, у меня та же байда: SD карточка на SPI не инициализируется, если запускаю дебаг - всё работает (програмный ресет с верификацией после подачи питания тоже помогает). Паузы перед инициализацией SDшки не помогают.
а то, похоже, у меня та же байда: SD карточка на SPI не инициализируется, если запускаю дебаг - всё работает (програмный ресет с верификацией после подачи питания тоже помогает). Паузы перед инициализацией SDшки не помогают.
меньше слов - больше дела