Stm32 계열 레지스터 접근문제


#1

현재 Coretex M3 : STM32L1 시리즈를 이용해서 개발중인데요
FSMC를 이용한 레지스터접근에 문제가 있어서 문의드립니다.
16bit 데이터버스를 사용하여 접근하려고 하거든요. 연결상태는 아래와 같습니다.

W5300 D[0:15] ---- FSMC Data bus D[0:15]
W5300 A[0:9] ---- FSMC Address bus A[0:9]
W5300 WR ---- FSMC NWE
W5300 RD ---- FSMC NOE
W5300 CS ---- FSMC NE
W5300 BIT16EN ---- High
W5300 RESET ---- GPIO IN
W5300 TESTMODE ---- GND

문제는 아래와 같습니다.
예를들어 예제코드 기준으로 W5300의 SHAR에 MAC 주소를 적기위해

  1. (uint16) (SHAR) = 0x0123;

  2. (uint16) (SHAR2) = 0x4567;

  3. (uint16) (SHAR4) = 0x89AB;
    를 차례대로 수행하게되면 레지스터 메모리값이 아래와같은 순서로 바뀌게됩니다.
    마치 주소번지의 0, 1비트가 Don’t care 인것처럼 동작하는데 무엇이 문제일까요?
    혹 설정이 잘못됐다던가. FSMC 설정할때 주의할것이 있다면 알려주십시오. 감사합니다.
    아. 참고로 RESET을 하고나면 [MR : 0x000] : 0xB800 이되는데
    또한 [IR : 0x002] : 0xB800으로 같이 바뀌어있습니다. 0x000, 0x002 이것도 0, 1비트가 Don’t care인것처럼
    동작해서 그런건지 참고해주십시오.

[SHAR : 0x008] : 0x0123;
[SHAR2 : 0x00A] : 0x0123;
[SHAR4 : 0x00C] : 0x0000;
[Reserv : 0x00E] : 0x0000;

[SHAR : 0x008] : 0x4567;
[SHAR2 : 0x00A] : 0x4567;
[SHAR4 : 0x00C] : 0x0000;
[Reserv : 0x00E] : 0x0000;

[SHAR : 0x008] : 0x4567;
[SHAR2 : 0x00A] : 0x4567;
[SHAR4 : 0x00C] : 0x89AB;
[Reserv : 0x00E] : 0x89AB;


W5300 배선에 관해 질문있습니다.
#2

안녕하세요.
STM32L1이 FSMC을 어떻게 처리하는지는 확인은 해보지 않았습니다만, 아마도 8BIT ADDRESS체계에 8bit Data width를 사용하는 것 같습니다.
W5300을 16BIT로 사용하고, IR register를 Read 할 경우 W5300의 A[9:1] 값은 0x0001을 갖으며, A[0]는 무시됩니다.
STM32L1 Data 비트 설정 및 Address bit shift 설정등이 어떻게 설정되었는지 확인부탁드립니다.

보다 자세한 지원을 위해서
STM32 FSMC 설정 부분을 설명해 주세요.


#3

STM32L1 FSMC는
8bit 단위 ADDRESS ACCESS가 가능하며
16bit 데이터버스를 사용합니다.

WIZNET에 W5300이 아니더라도 유사 칩에서 FSMC를 이용하여 16bit ACCESS한
펌웨어 소스가 있다면 공유해주시면 활용하고 싶습니다. (wellup0704@naver.com)


#4

안녕하세요. 말씀하신 W5300 16bit Driver입니다.
해당 드라이버는 PXA255 보드 example입니다.
http://www.wiznet.co.kr/UpLoad_Files/ReferenceFiles/W5300_Drv_V1.2.4.zip

8bit Address를 사용하신다고 하시니 Address Bus는 제대로 연결된 듯 합니다.

IR register를 읽을때 해당 A[9:0] = 0x0002, 즉 A[9:1]=0x0001 이 정확히 입력되는지 또한 한번 Read시 /RD signal이 한번만 뜨는지 확인 부탁드립니다.
상기 증상으로 보아 한번 Read시 /RD 혹은 /WR이 두번 뜰 가능성이 높습니다.


#5

W5300의 16bit/8bit address 관련해서 헷갈릴 소지가 있게 설명이 되어 있습니다.
ST의 STM32F와 STM32L1의 경우 FSCMC에서 16bit로 설정하게 되면, 외부 A(0)가 A(1)으로 자동으로 내부적으로 바뀌게 됩니다.
귀하께서 설계한 pin map을 보면 FSMC와 W5300에서 8bit로 변경해야 사용이 가능할거 같습니다.
16bit로 사용할려면 MCU의 A(0)을 W5300의 A(1)으로 연결해서 사용해야 됩니다. Databus는 16bit로 그대로 두고 단지 설정만 변경하시면…
참고가 되었으면 합니다.


#6

좋은 조언 감사합니다.
다른분들께 도움이 많이 될 것 같습니다.

내부에서 Address를 Shift 할 거라고는 생각 못했네요.
참고로, 다른 사용자들은 이럴 경우 Address 맵을 System이 지원하는 맵으로 변경하여 사용하기도 합니다.
예로) 0x0002를 System Map으로 (0x0002 << 1) = 0x0004 이런 식을 미리 Shift 시킵니다.

감사합니다.