Программируемый выход тактовой частоты
BAMB
Пункты: 341
Регистрация: 14.07.2010
Доброго времени суток.
Вобщем есть AT91SAM9XE512 (Debian 5.0), нужно вывести с АРМ тактовую частоту с выводов PCK1 и PCK0.
Для этого конфигурируем блок PLLB:
регистр CKGR_PLLBR - устанавливаем 0x8BF03 (MULB - 24, DIVB -3, OUTB -2 , PLLBCOUNT - 8).
На выходе PLLB должны получить PLLBCK = (MAINCK*(MULB+1))/DIVB ,т.е. 12x25/3 = 100 Мгц
Разрешаем програм. т.ч.:
регистр PMC_SCER - устанавливаем 0x3C1 (PCK0 -1, PCK1 -1)
Конфигурируем програм. т.ч.
регистр PMC_PCK1 - устанавливаем 0x13 (PRESS -100 ,CSS-11 ,)
Т.е. входную частоту PLLBCK делим на 16 получаем 6.25Мгц
Смотрим регистры статуса PMC_SCSR(PCK0 -1, PCK1 -1) и PMC_SR(PCKRDY1-1, PCKRDY0-1, LOCKB - 1, LOCKA-1)
Т.е. вроде все работает.
Смотрим осцилом вывод 17 разьема X7 - пусто.
Собственно, что я делаю не так, вывод в режиме GPIO работает нормально.
Jury093
Пункты: 54259
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
лучше выложите строки инита, так знающим людям будем проще понять что вы забыли прописать
На любой вопрос есть любой ответ.
BAMB
Пункты: 341
Регистрация: 14.07.2010
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <stdio.h>
#include <sys/mman.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <netdb.h>
#include <string.h>
#define MAP_SIZE 4096Ul
#define MAP_MASK (MAP_SIZE - 1)
#define MAP_PMC 0xfffffc00 /* Power Manager Controller*/
#define PMC_SCER 0x00 /* PMC System Clock Enable Register */
#define CKGR_PLLBR 0x2c /* PLL B Register */
#define PMC_PCK1 0x44 /* Programmable Clock 1 Register */
#define PMC_SCSR 0x08 /* System Clock Status Register */
#define PMC_SR 0x68 /* PMC status register */
int Set_PLLB_Clock()
{
int pllb;
void *map;
unsigned long read, write;
if ((pllb = open("/dev/mem", O_RDWR | O_SYNC)) == -1)
{
fprintf(stderr, "Cannot open /dev/mem.\n");
exit(EXIT_FAILURE);
}
fprintf(stderr, "/dev/mem opened.\n");
map = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, pllb, MAP_PMC & ~MAP_MASK);
if (map == (void *) -1)
{
fprintf(stderr, "Memory mapping error.\n");
exit(EXIT_FAILURE);
}
fprintf(stderr, "Memory block mapped at address %p.\n", map);
map+=(MAP_PMC & MAP_MASK);
fprintf(stderr, "Target address mapped 0x%08x-->0x%08x\n",(int) MAP_PMC,(int)map);
//PMC_SCER - 0000 0000 0000 0000 0000 0011 1100 0001 - 0x3C1
//PCK1 - 1, PCK0 - 1, UDP - 1, UHP - 1
write = 0x3C0;
*(unsigned long*)(map+PMC_SCER) = write;
printf("PMC System Clock Enable Register PMC_SCER - Written 0x%X\n", write);
//USBDIV - 01, MULB - 00000011000, OUTB - 10, PLLBCOUNT - 111110, DIVB - 00000011
//CKGR_PLLBR=0001 0000 0001 1000 1011 1110 0000 0011 - 0x1018BE03
write = 0x1018BE03;
*(unsigned long*)(map+CKGR_PLLBR) = write;
read = *(unsigned long*)(map+CKGR_PLLBR);
printf("PLL B Register CKGR_PLLBR - Written 0x%X - Read 0x%X\n", write, read);
//PRESS - 100, CSS - 11
//PMC_PCK = 0000 0000 0000 0000 0000 0000 00010011 - 0x13
write = 0x13;
*(unsigned long*)(map+PMC_PCK1) = write;
read = *(unsigned long*)(map+PMC_PCK1);
printf("Programmable Clock 1 Register PMC_PCK1 - Written 0x%X - Read 0x%X\n", write, read);
//Регистры статуса
read = *(unsigned long*)(map+PMC_SCSR);
printf("System Clock Status Register PMC_SCSR; readback 0x%X\n", read);
read = *(unsigned long*)(map+PMC_SR);
printf("PMC status register PMC_SR; readback 0x%X\n", read);
if (close (pllb) != 0)
{
fprintf (stderr, "Cannon close /dev/mem (descriptor=%d)\n", pllb);
exit(1);
}
close(pllb);
}
int main (int argc, char *argv[])
{
Set_PLLB_Clock();
}
Jury093
Пункты: 54259
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
я не специалист в этих закорючках, но на мой вкус не хватает выполнения пункта 26->26.7->7 с даташита..
Код 7. Enabling Peripheral Clocks
Once all of the previous steps have been completed, the peripheral clocks can be enabled
and/or disabled via registers PMC_PCER and PMC_PCDR.
Depending on the system used, 17 peripheral clocks can be enabled or disabled. The
PMC_PCSR provides a clear view as to which peripheral clock is enabled.
На любой вопрос есть любой ответ.
BAMB
Пункты: 341
Регистрация: 14.07.2010
[quote]я не специалист в этих закорючках, но на мой вкус не хватает выполнения пункта 26->26.7->7 с даташита..
Код 7. Enabling Peripheral Clocks
Once all of the previous steps have been completed, the peripheral clocks can be enabled
and/or disabled via registers PMC_PCER and PMC_PCDR.
Depending on the system used, 17 peripheral clocks can be enabled or disabled. The
PMC_PCSR provides a clear view as to which peripheral clock is enabled.
[/quote]
Этот пункт относится к перефирийным частотам, мне же нужны программируемые. Попробовал включить переферийную частоту PID22 которая относится к Image Sensor,т.к. вывод PCK1 совпадает с выводом тактирования этого интерфейса, результата так же никакого. Пробовал отключить ISI (может он мешает работе), но в регистре статуса постоянно висит, что он включен и отключаться не хочет.
BAMB
Пункты: 341
Регистрация: 14.07.2010
Вопрос решился бонально, оказывается выводы PCK были заняты за PIOB. Разрешил использование выводов для перефирии и все заработало.))