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

 
 
> 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
 
Start new topic
Ответов
shrek
сообщение Jan 13 2009, 10:19
Сообщение #2


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

Группа: Участник
Сообщений: 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



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

 


RSS Текстовая версия Сейчас: 12th August 2025 - 02:50
Рейтинг@Mail.ru


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