AT91SAM7 старт с коленки

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Аватара пользователя
romazan
Потрогал лапой паяльник
Сообщения: 335
Зарегистрирован: Чт май 21, 2009 13:54:07
Откуда: Москва
Контактная информация:

Re: AT91SAM7 старт с коленки

Сообщение romazan »

Привет радиокотам на базе ARM. Нужна помощь, чтобы разобраться с SPI интерфейсом. Решил тут подключить дисплей от нокии PCD8544 к SPI0 и тут же возникли баги. Дисплей молчит как рыба. У меня сто процентная уверенность что я неправильно работую с интерфейсом. Выкладываю код "keil":
Аватара пользователя
romazan
Потрогал лапой паяльник
Сообщения: 335
Зарегистрирован: Чт май 21, 2009 13:54:07
Откуда: Москва
Контактная информация:

Re: AT91SAM7 старт с коленки

Сообщение romazan »

Народ мож кто сталкивался с проблемой, что при отправке данных в SPI, некоторые из них не проходили.
У меня такая проблема, шлю данные в дисплей, он не запускается. Ладно. Начинаю вручную отлаживать - F11, данные начинают выходить и дисплей нормально запускается. Пробовал ставить задержки в секунду!!! Такая-же байда. У кого есть идеи?
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: AT91SAM7 старт с коленки

Сообщение ibiza11 »

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, в первой строчке кода Вы инициализируете порт в/в как структуру? не могли бы прокомментировать? я новичек :oops:
Ставим плюсы: )
Аватара пользователя
neonix
Электрический кот
Сообщения: 1040
Зарегистрирован: Чт фев 19, 2009 17:46:34
Контактная информация:

Re: AT91SAM7 старт с коленки

Сообщение neonix »

Вся периферия в стандартной библиотеке представлена структурами, кроме того для каждой переферии есть адреса в карте памяти SAM7S.
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 старт с коленки

Сообщение inkHunter »

ibiza11 писал(а):
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, в первой строчке кода Вы инициализируете порт в/в как структуру? не могли бы прокомментировать? я новичек :oops:

pPIOA это что такое ? только начинаю, разбираться
SII
Вымогатель припоя
Сообщения: 635
Зарегистрирован: Пт янв 30, 2009 14:50:35
Откуда: Солнечногорск

Re: AT91SAM7 старт с коленки

Сообщение SII »

pPIOA это что такое ? только начинаю, разбираться


Указатель на структуру, содержащую регистры порта ввода-вывода A, судя по всему.
Последний раз редактировалось SII Вт апр 12, 2011 02:00:21, всего редактировалось 1 раз.
inkHunter
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб авг 21, 2010 20:44:27
Откуда: Ростов
Контактная информация:

Re: AT91SAM7 старт с коленки

Сообщение inkHunter »

Victor Gordienko писал(а):
ibiza11 писал(а):
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, в первой строчке кода Вы инициализируете порт в/в как структуру? не могли бы прокомментировать? я новичек :oops:

pPIOA это что такое ? только начинаю, разбираться

а так можна
AT91PS_PIO pPIOA;
pPIOA->PIO_OER = AT91C_PIO_PA1 | AT91C_PIO_PA2;
SII
Вымогатель припоя
Сообщения: 635
Зарегистрирован: Пт янв 30, 2009 14:50:35
Откуда: Солнечногорск

Re: AT91SAM7 старт с коленки

Сообщение SII »

Нельзя. Сначала надо присвоить начальное значение pPIOA.
inkHunter
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб авг 21, 2010 20:44:27
Откуда: Ростов
Контактная информация:

Re: AT91SAM7 старт с коленки

Сообщение inkHunter »

Как обявить прерывание по нажатию кнопки у AT91SAM7 ?
SII
Вымогатель припоя
Сообщения: 635
Зарегистрирован: Пт янв 30, 2009 14:50:35
Откуда: Солнечногорск

Re: AT91SAM7 старт с коленки

Сообщение SII »

Кнопка заведена на какую-нибудь из ног микроконтроллера. Значит, нужно настроить эту самую ногу как вход (возможно, с включенной подтяжкой) и с генерацией запроса прерывания при изменении состояния. Как конкретно, нужно смотреть документацию на PIO. Ну а как объявить в программе, это я уже не знаю: на Си не пишу. Но сразу скажу, что там довольно много чего делать придётся, ведь запросы прерываний от периферии сначала поступают на контроллер прерываний (у АТМЕЛовских АРМов он называется AIC), а значит, для начала нужно правильным образом настроить его.
inkHunter
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб авг 21, 2010 20:44:27
Откуда: Ростов
Контактная информация:

Re: AT91SAM7 старт с коленки

Сообщение inkHunter »

У кого есть пример работы с USB для AT91SAM7 ?
Аватара пользователя
Satyr
Друг Кота
Сообщения: 7439
Зарегистрирован: Чт ноя 04, 2010 01:56:36
Откуда: г. Москва

Re: AT91SAM7 старт с коленки

Сообщение Satyr »

Victor Gordienko писал(а):У кого есть пример работы с USB для AT91SAM7 ?

Есть у сайта атмела.
Stepan
Встал на лапы
Сообщения: 126
Зарегистрирован: Пн мар 16, 2009 07:37:42
Откуда: Новосибирск

Re: AT91SAM7 старт с коленки

Сообщение Stepan »

Satyr писал(а): Есть у сайта атмела.
вот ссыль
меньше слов - больше дела
inkHunter
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб авг 21, 2010 20:44:27
Откуда: Ростов
Контактная информация:

Re: AT91SAM7 старт с коленки

Сообщение inkHunter »

Stepan писал(а):
Satyr писал(а): Есть у сайта атмела.
вот ссыль

Оу, что то там сложновато ((( ..... нет по русски ничего ?
inkHunter
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб авг 21, 2010 20:44:27
Откуда: Ростов
Контактная информация:

Re: AT91SAM7 старт с коленки

Сообщение inkHunter »

Помогити с прерыванием по приему 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)
{
}
}
Аватара пользователя
romazan
Потрогал лапой паяльник
Сообщения: 335
Зарегистрирован: Чт май 21, 2009 13:54:07
Откуда: Москва
Контактная информация:

Re: AT91SAM7 старт с коленки

Сообщение romazan »

сбросить прерывание забыл
inkHunter
Грызет канифоль
Сообщения: 287
Зарегистрирован: Сб авг 21, 2010 20:44:27
Откуда: Ростов
Контактная информация:

Re: AT91SAM7 старт с коленки

Сообщение inkHunter »

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 старт с коленки

Сообщение inkHunter »

Что никто не поможет ?
Аватара пользователя
romazan
Потрогал лапой паяльник
Сообщения: 335
Зарегистрирован: Чт май 21, 2009 13:54:07
Откуда: Москва
Контактная информация:

Re: AT91SAM7 старт с коленки

Сообщение romazan »

AT91C_BASE_AIC->AIC_EOICR = AT91C_BASE_US1 -> US_CSR
Stepan
Встал на лапы
Сообщения: 126
Зарегистрирован: Пн мар 16, 2009 07:37:42
Откуда: Новосибирск

Re: AT91SAM7 старт с коленки

Сообщение Stepan »

romazan, разобрались с проблемой со SPI?
а то, похоже, у меня та же байда: SD карточка на SPI не инициализируется, если запускаю дебаг - всё работает (програмный ресет с верификацией после подачи питания тоже помогает). Паузы перед инициализацией SDшки не помогают.
меньше слов - больше дела
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»