Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AT91SAM7A3 SPI PDC
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
shrek
Написал простенький проект в IARе
Суть в том что в AT91SAM7A3 2 интерфейса SPI котоые могут работать с контроллером прямого доступа к памяти PDC
я их друг к другу подцепил так что передача данных из одного SPI в другой идет без проблем все работает!)
проблемы интересные возникают когда SPI работает с PDC...
так вот в чем суть проблемы... когда SPI передает в линию то в контроллере PDC счетчик передачи декрементируется на 4!!!!
а когда ведомый SPI принимает то счетчик приема PDC декрементируется на 1!!! и данные побайтно записываются в ОЗУ допустим передали 8 байт эти 8 байт расположились в 2х словах 32 разрядных после приема!
а вот чтобы эти восемь байт нормально передать их надо расположить в 8 32х разрядных словах, из за того что счетчик передачи декрементируется на 4!!!
Никто не знает как решить эту проблему? скажем в регистрах PDC контроллера нет таких битов которые отвечали за то насколько бы декрементировался счетчик передачи или приема...
aaarrr
Вы еррату на SPI изучали?
shrek
ну да) тогда SPI я не поднял бы)
aaarrr
Тогда код в студию, пожалуйста.
shrek
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 в память контроллера записал)
aaarrr
Цитата(shrek @ Jan 13 2009, 12:57) *
AT91C_BASE_SPI0 -> SPI_MR = 0x0F0E0019;

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

P.S. Убедительно прошу, пользуйтесь тегами [сode][/сode] и символьными именами для битов регистров. Код абсолютно нечитаемый.
shrek
небольшой вопрос по последнему) я пишу в IARе коменты на русском после успешного копирования в окно ответа становятся абракадаброй)
Это как то избежать можно?)
ссори за оффтоп)

Спасибо большое за совет) все заработало!
к сожалению недавно начал ARM7 изучать многих ньансов не знаю пока)))
aaarrr
Попробуйте раскладку переключить на кириллицу при копировании.

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

Просто старайтесь всегда пользоваться последнеми версиями документов. Старые, конечно, тоже полезно хранить для истории.
Сергей Борщ
Цитата(shrek @ Jan 13 2009, 14:33) *
коменты на русском после успешного копирования в окно ответа становятся абракадаброй)
Это как то избежать можно?)
http://electronix.ru/forum/index.php?s=&am...st&p=501580
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.