реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> AT91SAM7A3 SPI PDC, Странности с контроллером PDC
shrek
сообщение Jan 13 2009, 09:18
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126



Написал простенький проект в IARе
Суть в том что в AT91SAM7A3 2 интерфейса SPI котоые могут работать с контроллером прямого доступа к памяти PDC
я их друг к другу подцепил так что передача данных из одного SPI в другой идет без проблем все работает!)
проблемы интересные возникают когда SPI работает с PDC...
так вот в чем суть проблемы... когда SPI передает в линию то в контроллере PDC счетчик передачи декрементируется на 4!!!!
а когда ведомый SPI принимает то счетчик приема PDC декрементируется на 1!!! и данные побайтно записываются в ОЗУ допустим передали 8 байт эти 8 байт расположились в 2х словах 32 разрядных после приема!
а вот чтобы эти восемь байт нормально передать их надо расположить в 8 32х разрядных словах, из за того что счетчик передачи декрементируется на 4!!!
Никто не знает как решить эту проблему? скажем в регистрах PDC контроллера нет таких битов которые отвечали за то насколько бы декрементировался счетчик передачи или приема...
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 13 2009, 09:40
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Вы еррату на SPI изучали?
Go to the top of the page
 
+Quote Post
shrek
сообщение Jan 13 2009, 09:45
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126



ну да) тогда SPI я не поднял бы)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 13 2009, 09:47
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Тогда код в студию, пожалуйста.
Go to the top of the page
 
+Quote Post
shrek
сообщение Jan 13 2009, 10:19
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126



PROGRAM start
RSEG INTRAMSTART_REMAP
RSEG INTRAMEND_REMAP
RSEG ICODE:CODE:ROOT(2)
CODE32

#define __ram_end SFB(INTRAMEND_REMAP)
ARM_MODE_USER EQU 0x10
ARM_MODE_IRQ EQU 0x12
I_BIT EQU 0x80
F_BIT EQU 0x40
stack_irq EQU 0x100
stack_user EQU 0x700
AIC_IVR EQU 0xFFFFF100
EXTERN init_perif
EXTERN main
org 0
B init
org 0x18
mov pc, #0x40
org 0x40
sub lr, lr, #4
stmdb sp!, {r0 - r12,lr}
ldr r0, =AIC_IVR
ldr pc, [r0]
ldr r0, =init_perif
mov lr, pc
mov pc, r0
msr CPSR_c, #ARM_MODE_IRQ | I_BIT | F_BIT
ldr sp,=__ram_end
msr CPSR_c, #ARM_MODE_USER | I_BIT | F_BIT
ldr sp,=__ram_end
sub sp, sp, #stack_user
ldr r0, =main
mov lr, pc
mov pc, r0
ENDMOD

END
-----------------------------------------------------------------------
#include "ioat91sam7a3.h"

unsigned char *a;
unsigned char *b;
unsigned int i,j;

init_perif()
{
a = (unsigned char *) 0x300;
b = (unsigned char *) 0x340;
i = 0;
while (i<16)
{
*(a+i) = (char) i; i++;
}
AT91C_BASE_RSTC -> RSTC_RMR = 0xA5000001;


AT91C_BASE_WDTC -> WDTC_WDMR = 0x00008000;


AT91C_BASE_CKGR -> CKGR_MOR = 0x00000F01;
AT91C_BASE_PMC -> PMC_MCKR = 0x00000019;
AT91C_BASE_PMC -> PMC_SCER = 0x00000001;
AT91C_BASE_PMC -> PMC_PCER = 0x00001804;


AT91C_BASE_PIOA -> PIO_PDR = 0x0003FFF0;
AT91C_BASE_PIOA -> PIO_ASR = 0x0003F800;
AT91C_BASE_PIOA -> PIO_BSR = 0x000007F0;

AT91C_BASE_SPI0 -> SPI_CR = 0x00000082;
AT91C_BASE_SPI0 -> SPI_MR = 0x0F0E0019;
AT91C_BASE_SPI0 -> SPI_IDR = 0x000003FF;
AT91C_BASE_SPI0 -> SPI_CSR[0] = 0x1FFFFF02;
AT91C_BASE_PDC_SPI0 -> PDC_TPR = (unsigned int) a;
AT91C_BASE_PDC_SPI0 -> PDC_TCR = 64;

AT91C_BASE_SPI1 -> SPI_CR = 0x00000082;
AT91C_BASE_SPI1 -> SPI_MR = 0x0F0E0018;
AT91C_BASE_SPI1 -> SPI_IDR = 0x000003FF;
AT91C_BASE_SPI1 -> SPI_CSR[0] = 0x00FFFF02;
AT91C_BASE_PDC_SPI1 -> PDC_RPR = (unsigned int) b;
AT91C_BASE_PDC_SPI1 -> PDC_RCR = 16;
}

----------------------------------------------------------------------------------------------------
#include "ioat91sam7a3.h"

main ()
{
AT91C_BASE_PDC_SPI0 -> PDC_PTCR = 0x00000102;
AT91C_BASE_PDC_SPI1 -> PDC_PTCR = 0x00000201;
AT91C_BASE_SPI1 -> SPI_CR = 0x00000001;
AT91C_BASE_SPI0 -> SPI_CR = 0x00000001;
while (1);
}

----------------------------------------------------------------------------

Прерывания я не использую

мне важно было зафиксировать факт передачи на осцыле) и посмотреть что PDC в память контроллера записал)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 13 2009, 10:20
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(shrek @ Jan 13 2009, 12:57) *
AT91C_BASE_SPI0 -> SPI_MR = 0x0F0E0019;

Бит FDIV(3) в SPI Mode Register отменили еще при царе Горохе, так как его установка приводит к возникновению кучи глюков.

P.S. Убедительно прошу, пользуйтесь тегами [сode][/сode] и символьными именами для битов регистров. Код абсолютно нечитаемый.
Go to the top of the page
 
+Quote Post
shrek
сообщение Jan 13 2009, 12:33
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126



небольшой вопрос по последнему) я пишу в IARе коменты на русском после успешного копирования в окно ответа становятся абракадаброй)
Это как то избежать можно?)
ссори за оффтоп)

Спасибо большое за совет) все заработало!
к сожалению недавно начал ARM7 изучать многих ньансов не знаю пока)))
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 13 2009, 12:36
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Попробуйте раскладку переключить на кириллицу при копировании.

Цитата(shrek @ Jan 13 2009, 15:33) *
к сожалению недавно начал ARM7 изучать многих ньансов не знаю пока)))

Просто старайтесь всегда пользоваться последнеми версиями документов. Старые, конечно, тоже полезно хранить для истории.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 13 2009, 15:01
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(shrek @ Jan 13 2009, 14:33) *
коменты на русском после успешного копирования в окно ответа становятся абракадаброй)
Это как то избежать можно?)
http://electronix.ru/forum/index.php?s=&am...st&p=501580


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 17th June 2025 - 14:47
Рейтинг@Mail.ru


Страница сгенерированна за 0.01411 секунд с 7
ELECTRONIX ©2004-2016