2013-12-16 9 views
0

베어 메탈 AM1808에 핀 멀티플렉싱을 시도하고 있지만 킥 레지스터를 쓸 수없는 것 같습니까? 또는 더 구체적으로 말하자면, 내가 쓰려고했던 값을 다시 읽을 수없는 것 같습니다. 베어 메탈 암 (AM1808) - 킥 레지스터에서 읽기

mode: 0x13 
kick0: 0x0 -> 0x0 
kick1: 0x0 -> 0x0 

는 일반적으로 나는 내가 관리자 모드에서 오전 있지만 킥 레지스터를 읽을 수없는 건가요 : 출력

#define SYSCFG_BASE ((void*volatile)0x01C14000) 
#define SYSCFG_KICK0R (*((unsigned int*volatile)(SYSCFG_BASE + 0x38))) 
#define SYSCFG_KICK1R (*((unsigned int*volatile)(SYSCFG_BASE + 0x3C))) 

#define KICK0_UNLOCK 0x83E70B13 
#define KICK1_UNLOCK 0x95A4F10 
#define KICK0_LOCK 0x0 
#define KICK1_LOCK 0x0 

static void 
gpio_init (int diode) 
{ 
    int status = 0; 
    asm volatile (
    "mrs %[ps],cpsr" : [ps]"=&r"(status) 
); 
    printf("mode: 0x%x\n", status & 0x1F); 

    printf("kick0: 0x%x", SYSCFG_KICK0R); 
    SYSCFG_KICK0R = KICK0_UNLOCK; 
    printf(" -> 0x%x\n", SYSCFG_KICK0R); 

    printf("kick1: 0x%x", SYSCFG_KICK1R); 
    SYSCFG_KICK1R = KICK1_UNLOCK; 
    printf(" -> 0x%x\n", SYSCFG_KICK1R); 

    /* pinmux stuff */ 

    SYSCFG_KICK0R = KICK0_LOCK; 
    SYSCFG_KICK1R = KICK1_LOCK; 
} 

: 여기

내 코드? 그렇다면 syscfg의 잠금을 올바르게 해제했는지 어떻게 테스트 할 수 있습니까?

UPDATE : 그것이 나오는 것에 , I가 갖는 한 문제 핀 다중화 또는 킥 레지스터에 관련되지 않고 대신 I은 정확하게 다중 GPIO 핀을 사용하는 최상위 논리 오류를 가지고 . 혼란을 드려 죄송합니다.

+0

AM1808 TechRef는 10.2.2 Kicker Mecahanism Protection에서 다음과 같이 말합니다. "Kick 레지스터는 실리콘 개정 2 및 이후 버전에서 비활성화됩니다 .SYSCFG 레지스터는 항상 잠금이 해제되고 Kick 레지스터에 쓰기는 기능적 효과가 없습니다. 회전 2 장치? –

+0

@MichaelBurr syscfg의 REVID 레지스터에'0x4E840102'가 들어 있습니다. 그러나이 개정판 2를 참조한다면 매뉴얼에서 아무 것도 찾을 수 없습니까? –

+0

저는 AM335x 매뉴얼을 가지고 있습니다. KICK 레지스터는 쓰기 전용입니다. 매뉴얼에 비슷한 내용이 있는지 확인하십시오. – auselen

답변

4

데이터 시트에 따르면 KICK1의 값은 0x95A4F1E0이어야하며 일치하지 않는 코드는 0x95A4F10입니다. 코드에서 시각적으로 명확한 점은 두 번째 값이 경고 신호 인 첫 번째 값보다 짧다는 것입니다.

또한 하드웨어의 Rev 2에는 더 이상 킥 레지스터가 없으므로 주석에서 지적했듯이이 역시 확인하십시오.

또한 printf()을 무서운 파킹의 순서로 호출하는 것이 안전한지 확인하십시오.

+0

고마워요, Kick1 상수는 제가 수정 한 오타가있었습니다. 불행히도, 나는 여전히 kick register에서 0을 읽는다. 나는 문제의 printf를 직접 썼다. 나는 안전면에서 무엇을 찾아야 하는가? –