๋งˆ์ดํฌ๋กœ์นฉ์Šค์˜ EEPROM ์ œํ’ˆ์ธ 25LC040A-E/OT ์— SPI๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๊ณ  ์ฝ๋Š” ๊ณผ์ •์„ ํ•  ๊ฒƒ์ด๋‹ค. DSP ๋Š” TMS320F28069 ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค.

 

1) SPI ์†ก์‹ ๊ณผ ์ˆ˜์‹ 

TI DSP๋กœ EEPROM๊ณผ SPI๋กœ ํ†ต์‹ ํ•˜๋Š” ๊ฒƒ์„ ์ด์ œ ์‹œ์ž‘ํ•ด ๋ณผ ๊ฒƒ์ด๋‹ค.

[TI] TMS320F28069 SPI ์„ธํŒ…ํ•˜๊ธฐ

[TI] TMS320F28069๋กœ EEPROM์ธ 25LC040A-E/OT๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์„ธํŒ…

 

(1) SPI TX

์•„๋ž˜ ์ฝ”๋“œ๋Š” SPI ์ „์†ก์— ๋Œ€ํ•œ ์ฝ”๋“œ์ด๋‹ค. EEPROM์— ์“ฐ๋Š” ๊ณผ์ •์€ ์•„๋ž˜์•„๋ž˜ ํ•จ์ˆ˜๋ฅผ ํ™•์ธํ•˜์ž.

void Spibtxwr(Uint16 Data)
{
    SpibRegs.SPITXBUF = Data;
    while(SpibRegs.SPISTS.bit.INT_FLAG !=1) { }
}

์˜ˆ์ œ ์†Œ์Šค์ธ๋ฐ, ์—ฌ๊ธฐ์„œ ํ•ต์‹ฌ์€ ์ด๋…€์„์ด๋‹ค. SpibRegs.SPITXBUF = Data; 

 

SPI ์ „์†ก ๋ฒ„ํผ์— ๋ฐ์ดํ„ฐ๋ฅผ ์“ด๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ž๋™์œผ๋กœ ์‰ฌํ”„ํŠธ ๋ ˆ์ง€์Šคํ„ฐ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณต์‚ฌ๋˜๊ณ  ์ถœ๋ ฅ์ด ๋œ๋‹ค. ์ถœ๋ ฅ์ด ์™„๋ฃŒ๊ฐ€ ๋˜์—ˆ๋‹ค๋ฉด SPISTS ๋ ˆ์ง€์Šคํ„ฐ์˜ 6๋ฒˆ ๋น„ํŠธ์ธ INT_FLAG๊ฐ€ 0์—์„œ 1๋กœ ๋ฐ”๋€” ๊ฒƒ์ด๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ–ˆ๋‹ค๊ณ  ์•Œ๋ฆฌ๋Š” ํ”Œ๋ž˜๊ทธ์ด๋‹ค. ์ด ํ”Œ๋ž˜๊ทธ๋ฅผ ํ†ตํ•ด์„œ ์œ ์ €๋Š” ์ „์†ก์ด ์™„๋ฃŒ๋œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

 

์ด ์ธํ„ฐ๋ŸฝํŠธ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ง€์šฐ๋Š” ๋ฐฉ๋ฒ•์€ 3๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. ๊ฐ€์žฅ ๋จผ์ € SPI ์ˆ˜์‹  ๋ฒ„ํผ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด๊ฐ€๋Š” ๊ฒƒ์ด๋‹ค. ๋‹ค์Œ์€ SPI SW RESET์„ ํ•˜๋Š” ๊ฒƒ์ธ๋ฐ, SPI๊ฐ€ ๋จนํ†ต์ด ๋œ ๊ฒƒ ๊ฐ™์œผ๋ฉด ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๊ฒ ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ์‹œ์Šคํ…œ ๋ฆฌ์…‹์„ ํ–ˆ์„๋•Œ 0์œผ๋กœ ์ดˆ๊ธฐํ™”๋œ๋‹ค. ์ด๊ฑด ๊ฑฐ์˜ ์‚ฌ์šฉํ•  ์ผ ์—†์„ ๊ฒƒ ๊ฐ™๋‹ค.

 

(2) SPI RX

์œ„์—์„œ SPI ์†ก์‹ ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ดค๋‹ค. ์ด์ œ๋Š” ์ˆ˜์‹ ์— ๋Œ€ํ•ด์„œ ๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

Uint16 SpibRxRd(Uint16 Data)
{
    Uint16 rxdata;
    SpibRegs.SPITXBUF = Data;
    while(SpibRegs.SPISTS.bit.INT_FLAG !=1) { }
    rxdata = SpibRegs.SPIRXBUF;
    return(rxdata);
}

SPI๋กœ ์ˆ˜์‹ ์„ ๋ฐ›์„ ๋•Œ ์ˆ˜์‹  ๋ฐ›์„ ๋ฐ์ดํ„ฐ์˜ ์–ด๋“œ๋ ˆ์Šค ๊ฐ’์„ ์Šฌ๋ ˆ์ด๋ธŒ์ธ EEPROM์—๊ฒŒ ์ „์†กํ•ด ์ค˜์•ผ ํ•œ๋‹ค. ์–ด๋“œ๋ ˆ์Šค ๊ฐ’์„ ๋ฐ›์€ ์Šฌ๋ ˆ์ด๋ธŒ๋Š” ์ฆ‰์‹œ ํ•ด๋‹น ์–ด๋“œ๋ ˆ์Šค์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ MISO๋ฅผ ํ†ตํ•ด ์ „์†กํ•ด์ค€๋‹ค.

 

SPISTS ๋ ˆ์ง€์Šคํ„ฐ์˜ 6๋ฒˆ ๋น„ํŠธ์ธ INT_FLAG ๋Š” ์†ก์‹ ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ˆ˜์‹ ์ด ์™„๋ฃŒ๋˜๋ฉด ํ”Œ๋ž˜๊ทธ๊ฐ€ 0์—์„œ 1์ด ๋œ๋‹ค. SPIRXBUF์—์„œ rxdata ์ง€์—ญ๋ณ€์ˆ˜๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜จ ํ›„ ๋ฆฌํ„ด์‹œํ‚ค๋Š” ์ฝ”๋“œ์ด๋‹ค.

 

๊ทธ๋Ÿฐ๋ฐ TXํ• ๋•Œ ๋ฐœ์ƒํ•œ INT_FLAG๋ฅผ ํ•ด์†Œ์‹œํ‚ค์ง€ ์•Š์œผ๋ฉด ์œ„ ํ•จ์ˆ˜์—์„œ ์–ด๋“œ๋ ˆ์Šค ๊ฐ’์„ ์ „๋‹ฌํ•˜๊ณ  ํ™•์ธํ•ด์•ผ ํ•  ํ”Œ๋ž˜๊ทธ๋Š” ์–ป์งˆ ๋ชปํ•œ๋‹ค. ์ธ์œ„์ ์œผ๋กœ ํ”Œ๋ž˜๊ทธ๋ฅผ ํ•œ๋ฒˆ ํ•ด์†Œํ•ด์ฃผ๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•  ๋“ฏ ํ•˜๋‹ค.

 

2) EEPROM์— ์“ฐ๊ณ  ์ฝ๊ธฐ

์œ„์—์„œ DSP๋กœ SPI ์†ก์‹ ๊ณผ ์ˆ˜์‹ ์— ๋Œ€ํ•œ ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ดค๋‹ค. ์ด์ œ EEPROM์— ์“ฐ๊ณ  ์ฝ์–ด๋ณด์ž.

 

(1) WRITE

SPI๋กœ EEPROM์— ์•„๋ฌด๊ฐ’์ด๋‚˜ ์ ์–ด์ฃผ๊ณ ์ž ํ•œ๋‹ค. ์“ฐ๊ธฐ๋ฅผ ํ•˜๊ธฐ ์ „์— ๋จผ์ € ์“ฐ๊ธฐ๋ฅผ ํ™œ์„ฑํ™” ์‹œํ‚ค๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค. ๊ทธ ์‹œํ€€์Šค๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

CS๋ฅผ 1์—์„œ 0์œผ๋กœ ๋–จ๊ตฐ ํ›„ MOSI๋กœ ์“ฐ๊ธฐ ํ™œ์„ฑํ™” ๋ช…๋ น์„ ๋จผ์ € ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ๋ช…๋ น(0000 0110)์„ ์ฃผ๊ณ ๋‚˜๋ฉด CS๋ฅผ ๋‹ค์‹œ 1๋กœ ์˜ฌ๋ ค์ฃผ์ž.

 

๋ถ€์ˆ˜์ ์œผ๋กœ ์“ฐ๊ธฐ ๋น„ํ™œ์„ฑํ™” ์‹œํ€€์Šค๋Š” ๋ณด๊ณ ๋งŒ ์ง€๋‚˜๊ฐ€๊ฒ ๋‹ค. ๋น„ํ™œ์„ฑํ™” ๋ช…๋ น์€ 0000 0100 ์ด๋‹ค.

 

์ด์ œ ์“ฐ๊ธฐ๋ฅผ ํ™œ์„ฑํ™”ํ–ˆ๋‹ค๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๋Š” ๊ณผ์ •์„ ๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

์“ฐ๊ธฐ๋ฅผ ํ• ๋•Œ๋Š” ๋ช…๋ น๊ณผ ์–ด๋“œ๋ ˆ์Šค๋ฅผ ์ฃผ๊ณ ๋‚œ ํ›„ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๋Š” ์ˆœ์„œ๋กœ ํ•˜๋ฉด๋œ๋‹ค.

 

๊ทธ๋Ÿผ ์ด์ œ ์˜ˆ์ œ ์†Œ์Šค๋ฅผ ๋ณด๊ฒ ๋‹ค.

void EpWrite(Uint16 EE_address,Uint16 EE_data)
{
    EP_CS = 1;
    DelayLoop(1);
    EP_CS = 0;
    SpibTxWr(EWEN);

    EP_CS = 1;
    DelayLoop(1);
    EP_CS = 0;
    SpibTxWr((WRITE) | (EE_address));
    SpibTxWr(EE_data);
    DelayLoop(1);
    EP_CS = 1;
}

EP_CS๋Š” SPI CS์ด๋‹ค. f28069_Peri.h ํŒŒ์ผ์— ์ •์˜๋˜์–ด ์žˆ๋‹ค.

#define EP_CS               GpioDataRegs.GPADAT.bit.GPIO15

EWEN์ด๋ผ๋Š” ๋…€์„์€ ์œ„์—์„œ ๋ดค๋˜ ์“ฐ๊ธฐ ํ™œ์„ฑํ™”๋ฅผ ์œ„ํ•œ ๋ช…๋ น ์ฝ”๋“œ์ด๋‹ค. f28069_Peri.c ํŒŒ์ผ์— ์ •์˜ ๋˜์–ด ์žˆ๋‹ค.

#define EWEN        (0x0600)  // 0000 0110 0000 0000

WRITE๋Š” ์“ฐ๊ธฐ ๋ช…๋ น(0000)๊ณผ ์“ฐ๊ธฐ ์–ด๋“œ๋ ˆ์Šค(0010)์— ๋Œ€ํ•œ ๊ฐ’์ด๋‹ค. f28069_Peri.c ํŒŒ์ผ์— ์ •์˜๋˜์–ด ์žˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์–ด๋“œ๋ ˆ์Šค๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜1์ธ EE_address์ด๋‹ค.

#define WRITE       (0x0200)

 

EP_CS๋ฅผ 1์„ ์ฃผ๊ณ  ๊ณง ๋ฐ”๋กœ 0์œผ๋กœ ๋‚ด๋ ค์„œ ์นฉ ์…€๋ ‰ํŠธ๋ฅผ ํ•ด์ค€ ํ›„ ์“ฐ๊ธฐ ํ™œ์„ฑํ™” ๋ช…๋ น์„ SPI ์ „์†ก ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์จ์ค€๋‹ค. ๊ทธ ํ›„ CS๋ฅผ 1๋กœ ์˜ฌ๋ฆฐ ํ›„ ๋‹ค์‹œ CS๋ฅผ 0์œผ๋กœ ๋‚ด๋ ค์„œ ๋ช…๋ น๊ณผ ์–ด๋“œ๋ ˆ์Šค๋ฅผ ์จ์ค€ ํ›„ ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๋Š” ๊ณผ์ •์ด๋‹ค. ๋ฐ์ดํ„ฐ๊นŒ์ง€ ์“ฐ๊ณ ๋‚˜๋ฉด CS๋ฅผ 1๋กœ ๋‹ค์‹œ ์˜ฌ๋ ค์ค€๋‹ค.

 

(2) READ

์ด์ œ EEPROM์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ๊ณผ์ •์ด๋‹ค.

์ฝ์„๋•Œ๋Š” ๊ฐ„๋‹จํ•˜๋‹ค. CS๋ฅผ 0์œผ๋กœ ๋‚ด๋ฆฐ ํ›„ ์œ„์™€ ๊ฐ™์ด ๋ช…๋ น(0000)+์ฝ๊ธฐ ์–ด๋“œ๋ ˆ์Šค(0011)+์ฝ์–ด์˜ฌ ์–ด๋“œ๋ ˆ์Šค ๊ฐ’์„ EEPROM์—๊ฒŒ ์ „์†กํ•˜๋ฉด  MISO๋ฅผ ํ†ตํ•ด์„œ ํ•ด๋‹น ์–ด๋“œ๋ ˆ์Šค์— ์ €์žฅ๋˜์–ด ์žˆ๋˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Uint16 EpRead(Uint16 EE_address)
{
    Uint16 EE_data;

    EP_CS = 1;
    DelayLoop(1);
    EP_CS = 0;
    SpibTxWr((READ) | EE_address);

    EE_data = SpibRxRd(DUMMY_BYTE);       // dummy byte send & Read Data
    DelayLoop(1);
    EP_CS = 1;
    return(EE_data);
}

CS๋ฅผ 0์œผ๋กœ ๋‚ด๋ฆฐ ํ›„ SPI ์ „์†กํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ EEPROM์˜ ์–ด๋“œ๋ ˆ์Šค ๊ฐ’์„ ๋งค๊ฐœ๋ณ€์ˆ˜(EE_address)๋ฅผ ํ†ตํ•ด ๋„ฃ์–ด์ค€๋‹ค. ์ฝ๊ธฐ ์–ด๋“œ๋ ˆ์Šค์ธ READ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ •์˜๋˜์–ด ์žˆ๋‹ค.

#define READ        (0x0300)

 

 

์ด์ œ ์†ก์ˆ˜์‹ , ์ฝ๊ณ  ์“ฐ๊ธฐ๊ฐ€ ์ž˜ ๋˜๋Š”์ง€ ํ™•์ธ์„ ํ•ด๋ณด์ž.

๋ฐ˜์‘ํ˜•
  • ๋„ค์ด๋ฒ„ ๋ธ”๋Ÿฌ๊ทธ ๊ณต์œ ํ•˜๊ธฐ
  • ๋„ค์ด๋ฒ„ ๋ฐด๋“œ์— ๊ณต์œ ํ•˜๊ธฐ
  • ํŽ˜์ด์Šค๋ถ ๊ณต์œ ํ•˜๊ธฐ
  • ์นด์นด์˜ค์Šคํ† ๋ฆฌ ๊ณต์œ ํ•˜๊ธฐ

"์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค."