로그인회원등록 내글장바구니주문조회현재접속자
 상품 검색








 게시판 검색





 
 
회원등록 비번분실


온라인 입금계좌
ㆍ기업은행
ㆍ219-043192-01-028
ㆍ이건영

      거래은행 바로가기
 
 Sensor Applications
아듀이노 공개소스
작성자 avrtools™        
작성일 2008/08/24
첨부#1 sd-reader_source.zip (50KB) (Down:1223)
Link#1 (Down:311)
ㆍ추천: 0  ㆍ조회: 9658   
  아듀이노 SD/MMC 카드
참조 : http://jvcideas.blogspot.com/
제목 : Adding an SD/MMC card - step 1

SD/MMC 카드 단계-1 (부품 추가) 
 
단계 1
3.3V LDO를 구해서 SD카드에 연결한다.
LM317T와 약간의 저항을 사용하여, 아듀이노 기판의 5V 출력을 3.3V로 바꾼다.
 
SD/MMC 카드의 핀 배열  (SPI 모드)
1. CS :  카드 선택(active low) ---> SS (아듀이노 D10 = PB2)
2. DI  :   데이터 입력 (카드로 들어가는 명령 및 데이터) ---> MOSI (아듀이노 D11 = PB3)
3. VSS : GND 접지
4. VDD : +3.3V 전원
5. CLK : 데이터 시프트 Clock  ----> SCK (아듀이노 D13 = PB5)
6. VSS :  GND 접지
7. DO : 데이터 출력 (카드에서 나가는 데이터 및 상태) ---> MISO (아듀이노 D12 = PB4)

MMC/SD 카드의 회로
포트번호에 관계없이 AVR 포트의 SPI 핀에 맞추어야 한다.
시프트 클럭 SCK, 읽기 데이터 MISO, 쓰기 데이터 MOSI, 카드선택 SS 핀이다.
 
  

단계 2
준비된 SD 카드 하드웨어를 읽고,쓰는 펌웨어(실행코드)를 만든다.
 
 

SD/MMC 카드 단계-2 (시험)
나는 약간의 실험용 코드를 썻다, 그리고 전압을 낮추는 저항을 조정했다.
이것은 PC의 직렬포트를 사용하며, 아듀이노 기판의 D10~D13의 각핀의 교환을 허용한다.
모든 코드의 작성과 분압회로(voltage divider)는 잘 동작하는 것으로 보인다.
의문은 내가 쓴 코드 혹은 다른 코드를 써서 실험하는 것이다.
 
AVRLib는 SD 카드에 매우 쉽게 적용할 수 있는 MMC 코드를 가지고 있다.
그러나, CF 카드 인퍼페이스를 연결했을 때에도 잘 사용하던,
AVRLib는 아듀이노 환경에 통합(integrate)할 수 없을 것이다.
그곳 외에는 AVR 예제가 없다, 심지어 FAT 포맷과 IDE 까지 찾았다.
CF 카드는 IDE 구동회로를 어쨋든 좋아하기 때문이다.

시험용 코드
int incomingByte = '1';
int prevByte = 0;
int pinArray[] = { 10, 11, 12, 13 };
int pinCount = 4;
int LastPinVals[] = { LOW, LOW, LOW, LOW };
int count = 0;

void setup()
{
  for (count=0;count<pinCount;count++) pinMode(pinArray[count], OUTPUT);
  reset_pins();
  Serial.begin(9600);
  Serial.println("Start");
}

void reset_pins()
{
   for (count=0;count<pinCount;count++)
  {
    digitalWrite(pinArray[count], LOW);
  }
}

int pinToIdx(int pin)
{
  int i;
  for (i = 0; i < pinCount; i++)
  {
    if (pinArray[i] == pin) return i;
  }
  return 0;
}

void toggle(int pin)
{
  digitalWrite(pin, ! LastPinVals[pinToIdx(pin)]);
  LastPinVals[pinToIdx(pin)] = ! LastPinVals[pinToIdx(pin)];
}

int byteToPin(int byteVal)
{
  return pinArray[byteVal - '1'];
}

void loop()
{
  if (Serial.available() > 0)
  {
    incomingByte = Serial.read();
    if (incomingByte >= '1' && incomingByte <= '4')
    {
      if (prevByte != incomingByte)
      {
        Serial.print("Got ");
        Serial.println(incomingByte);
        toggle(byteToPin(incomingByte));
        prevByte = incomingByte;
      }
    }
  }
}

SD/MMC 카드 단계-3 (작동)

 
얼마 전에 roland-reigel 이 쓴 SD 카드를 사용한, 그녀의 글을 ladyada의 게시판에서 읽었다.
roland-reigel 의 코드를 적용한 ladyada의 코드를 사용해서, 나의 SD 카드를 읽을 수 있었다.
코드는 아듀이노 기판의 메모리를 거의 사용한다고 말했다. 사실이다.

기대하는데, 나는 약간의 데이터를 저장하고 꺼내쓸수(play back) 있을 것이다.
나는 SD 카드에서 동작하는 AVRLIB mmc 코드와 mmc 시험 프로그램을 만들 수 있엇다.
그리고 아듀이노에 업로드하고 아듀이노를 사용하였다.

읽기(read), 쓰기(write), 초기화(init) 같은 명령줄(command line)로 mmc 기능을 시험한다.
이것은 SD 가드에 좋은 인터페이스 처럼 보였다, 그러나 status register에서 오류가 발생했다.
오류 코드는 0x5 이다. 나는 오류를 찾았고, 그리고 어떻게 된것인지 이유는 모른다.
지금은 정상적으로 작동한다. 나는 이 프로젝트를 마무리 했다.

Roand Riegel의 SD 카드리더의 제작
  
 
참조 사이트 : http://www.roland-riegel.de/sd-reader/index.html
첨부파일 : Roand Riegel의 SD 카드리더의 소스

-----------------------------------------------------------------------------------------------------------------
일반 AVR용 MMS/SD 카드의 SPI 인터페이스 소스
#define SPIDDR     DDRB    // D8~D13의 포트 방향
#define SPIPORT   PORTB // D8~D13의 출력 포트
#define SPIPIN      PINB    // D8~D13의 입력 포트
 
#define SCLK        0x20  // D13  시프트 클럭
#define MOSI        0x08  // D11  데이터 쓰기
#define MISO        0x10  // D12 데이터 읽기
#define CS           0x04  // D10  MMC 카드 선택
 
MMC 초기화
1. 카드버퍼를 지움
2. 카드를 선택
3. 레셋 명령
4. 초기화 명령
 
int MMCInit(void)
{
  unsigned int i;
  unsigned char Byte;
 
  SPIDDR = SCLK + MOSI + CS + MMCPOWER;
  SPIPORT = 0x00;
  Delay_1ms(500);
  SPIPORT |= MMCPOWER;
  SPIPORT |= CS;
  SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR1) | (1<<SPR0);    /* enable SPI as master, set clk divider */
  Delay_1ms(250);
  
  for(i=0;i<10;i++) /* start off with 80 bits of high data with card deselected */
  SpiByte(0xff);
  SPIPORT &= ~CS;        /* select card */
  MMCCommand(0,0,0);   /* now send CMD0 - go to idle state */
 
  if (MMCGet() != 1)
  {
    SPIPORT |= CS;
    return -1;  // MMC Not detected
   }
    i = 0xffff; /* send CMD1 until we get a 0 back, indicating card is done initializing */

  while ((SpiByte(0xff) != 0) && (--i)) MMCCommand(1,0,0);
  if (i == 0)
  {
    SPIPORT |= CS;
    return -2;  // Init Fail
  }
  SPIPORT |= CS;
  return 0;
}
 
MMC 확인
카드의 포멧 CID와 CSD를 읽는다.
 
void MMCInfo(void)
{
  int i;
  MMCCommand(10,0,0);
  if (MMCDataToken() != 0xfe) TxString("MMC: error during CID read\n\r\0");
  else TxString("MMC: CID read\n\r\0");
 
  SpiByte(0xff);    // Skip 3 byte Manufacturer ID
  SpiByte(0xff);
  SpiByte(0xff);
  TxString("MMC: Product Name : ");
  for (i=0;i<7;i++) TxChar(SpiByte(0xff));
  TxString("\n\r\0");
  for (i=0;i<9;i++) SpiByte(0xff); // Read 9 left byte
  SPIPORT |= CS;
}
 
MMC 섹터읽기
입력 : LBA 번호, 저장할 주소 (unsigned long lba, unsigned char * s)
출력 : 지정된 LBA의 섹터(512 바이트)를 읽어서, 포인터 *s에 지정한 메모리에 저장
 
int MMCReadSector(unsigned long lba, char *s)
{
  unsigned int i;
  MMCCommand(17,(lba>>7) & 0xffff, (lba<<9) & 0xffff);
  if (MMCDataToken() != 0xfe)
  {
    SEI();
    return -1;
  }
 
  for (i=0;i<512;i++)     /* read the sector */
 {
    *s++ = SpiByte(0xff);
 }

 SpiByte(0xff);          /* checksum -> don't care about it for now */
 SpiByte(0xff);       /* checksum -> don't care about it for now */
 SPIPORT |= CS;
 return 0;
}
 
MMC 섹터 쓰기
입력 ; LBA 번호, 512 바이트가 저장된 주소(unsigned long lba, unsigned char * s)
출력 ; 512 바이트를 지정된 LBA 주소의 섹터에 저장한다.
 
int MMCWriteSector(unsigned long lba, char *s)
{
  unsigned int i;
  MMCCommand(24, (lba>>7)& 0xffff, (lba<<9)& 0xffff);
  if (MMCGet() == 0xff) return -1;
  SpiByte(0xfe);  // Send Start Byte
  for (i=0;i<512;i++)  SpiByte(*s++);  // data save to sector of LBA

  SpiByte(0xff);          /* checksum -> don't care about it for now */
  SpiByte(0xff);       /* checksum -> don't care about it for now */
  SpiByte(0xff);       /* Read "data response byte"                 */
 
  i = 0xffff;
  while ((SpiByte(0xff) == 0x00) && (--i)); /* wait for write finish */
  if (i == 0) return -1; // Error
  SPIPORT |= CS;
  return 0;
}
 
/************************************************************
 * unsigned char MMCGet(void)
 * - pings the card until it gets a non-0xff value
 * - returns one byte of read info
 ************************************************************/
unsigned char MMCGet(void)
{
  unsigned int i = 0xffff;
  unsigned char Byte = 0xff;
  while((Byte == 0xff) && (--i)) Byte = SpiByte(0xff);
  return Byte;
}
 
/************************************************************
 * int MMCDataToken(void)
 * - pings the card until it gets data token
 * - returns one byte of read info (data token)
 ************************************************************/
unsigned char MMCDataToken(void)
{
  unsigned int i = 0xffff;
  unsigned char Byte = 0xff;
  while((Byte != 0xfe) && (--i)) Byte = SpiByte(0xff);
  return Byte;
}
 
/************************************************************
 * void MMCCommand(unsigned char command, unsigned int px, unsigned int py)
 * - send one byte of 0xff, then issue command + params + (fake) crc
 * - eat up the one command of nothing after the CRC
 ************************************************************/
void MMCCommand(unsigned char command, unsigned int px, unsigned int py)
{
  SPIPORT &= ~CS;
  SpiByte(0xff);
  SpiByte(command | 0x40);
  SpiByte((unsigned char)((px >> 8)&0x0ff)); /* high byte of param y */
  SpiByte((unsigned char)(px & 0x00ff));     /* low byte of param y */
  SpiByte((unsigned char)((py >> 8)&0x0ff)); /* high byte of param x */
  SpiByte((unsigned char)(py & 0x00ff));     /* low byte of param x */
  SpiByte(0x95);            /* correct CRC for first command in SPI          */
  
  /* after that CRC is ignored, so no problem with */
  /* always sending 0x95                           */
  SpiByte(0xff);
}
 
/*****************************************************
 * Main SPI routine
 *  - transmits a byte and receives a byte simultaneously
 *  - received byte is returned
 *  - if you only want to read a byte, put a dummy
 *    (say 0xff) in the transmit slot
 ****************************************************/
unsigned char SpiByte(unsigned char byte)
{
  WDR();
  SPDR = byte;               /* put byte to send in SPDR, which initiates xmit  */
  while(!(SPSR & (1<<SPIF)));/* wait for completion */
  return SPDR;               /* return with byte shifted in from slave */
}
 
 AVRTOOLS™
   
윗글 아듀이노 MIDI 드럼
아래글 아듀이노 MIDI 플륫
    N         제목    글쓴이 작성일 조회 추천
61 비접점식 QTouch 방식 근접검출 스위치 leeky 2016/01/21 (목) 565 0
60 Arduino 고속 오실로스코프 #3 avrtools™ 2012/03/29 (목) 17616 0
59 아날로그 8ch 데이터 로거 avrtools™ 2012/03/29 (목) 2724 0
58 Arduino DMX512 송신기 제작 avrtools™ 2012/03/15 (목) 2829 0
57 nRF24L01 무선모듈의 사용방법 avrtools™ 2012/03/07 (수) 5626 0
56 초음파 거리 측정기의 제작 avrtools™ 2011/09/18 (일) 4702 0
55 3축 가속도 센서 ADXL335 avrtools™ 2011/09/09 (금) 3242 0
54 Arduino Uno USBserial 펌웨어의 변경 avrtools™ 2011/08/27 (토) 2886 0
53 Arduino MIDI의 소개 avrtools™ 2011/08/19 (금) 3267 0
52 Arduino 고속 Oscillo Scope #2 avrtools™ 2011/08/12 (금) 2869 0
51 Arduino Uno 및 USB2serial Uno의 소개 [2] avrtools™ 2011/07/30 (토) 3129 0
50 Arduino IDE에서 AVRISP-mkII 사용방법 avrtools™ 2010/10/22 (금) 7749 0
49 아듀이노 초음파 거리측정 및 응용 avrtools™ 2010/03/14 (일) 4035 0
48 M328-USB의 비밀 온도센서 avrtools™ 2010/01/02 (토) 3463 0
47 M168-mini로 만드는 USBasp avrtools™ 2009/10/10 (토) 5113 0
46 OBDuino ISO9141 소스의 설명 avrtools™ 2009/10/08 (목) 4017 0
45 아듀이노 0017 업그레이드 avrtools™ 2009/08/18 (화) 3544 0
44 Arduino 0015 업그레이드 avrtools™ 2009/06/01 (월) 3227 0
43 CC2500 Zigbee RF Modem #1 [4] avrtools™ 2008/11/20 (목) 6434 0
42 아듀이노 소프트웨어 Ver 0012 avrtools™ 2008/09/23 (화) 3897 0
41 Arduino 소프트웨어 설치방법 avrtools™ 2008/08/31 (일) 5431 0
40 아듀이노 PC 카메라 제작 avrtools™ 2008/10/28 (화) 7026 0
39 아듀이노 AVR-ISP V2의 제작 [6] avrtools™ 2008/10/22 (수) 8058 0
38 아듀이노 J1850-PWM 스캐너 avrtools™ 2008/10/15 (수) 4417 0
37 아듀이노 MPGduino의 제작 avrtools™ 2008/10/11 (토) 4733 0
36 아듀이노 OBD-II PID 처리함수 avrtools™ 2008/10/12 (일) 5332 0
35 아듀이노 OBD-II PID 송수신 함수 avrtools™ 2008/10/09 (목) 9430 0
34 아듀이노 ODB-II 스캐너 제작 [9] avrtools™ 2008/10/04 (토) 16793 0
33 아듀이노 AC전원 THD 측정 [2] avrtools™ 2008/09/30 (화) 6584 0
32 아듀이노 소프트방식 16Bit ADC avrtools™ 2008/09/23 (화) 5419 0
31 아듀이노 초음파 모듈의 제작. avrtools™ 2008/09/22 (월) 4690 0
30 아듀이노 Wii 프로세싱 avrtools™ 2008/09/20 (토) 4009 0
29 아듀이노 초음파 거리측정 avrtools™ 2008/09/20 (토) 5908 0
28 아듀이노 8x5 초소형 전광판 avrtools™ 2008/09/11 (목) 4524 0
27 아듀이노 4선식 터치패널 avrtools™ 2008/09/10 (수) 4544 0
26 아듀이노 2색 8x8 LED avrtools™ 2008/09/10 (수) 4752 0
25 아듀이노 24x6 LED 전광판 avrtools™ 2008/09/10 (수) 5274 0
24 아듀이노 8x8 LED 프로세싱 avrtools™ 2008/09/10 (수) 4004 0
23 아듀이노 32x16 RGB 전광판 avrtools™ 2008/09/06 (토) 13527 0
22 아듀이노 맥박검출기 avrtools™ 2008/09/03 (수) 9264 0
21 아듀이노 적외선 거리센서 avrtools™ 2008/09/01 (월) 5736 0
20 아듀이노 DMX 수신장치 [7] avrtools™ 2008/08/31 (일) 6595 0
19 아듀이노 AVR-ISP 만들기 avrtools™ 2008/08/30 (토) 4028 0
18 아듀이노 POV #3 avrtools™ 2008/08/30 (토) 3343 0
17 아듀이노 POV #2 avrtools™ 2008/08/30 (토) 3149 0
16 AVR 병렬포트 굽기장치 avrtools™ 2008/08/30 (토) 5056 0
15 아듀이노 DMX 송신기 avrtools™ 2008/08/28 (목) 4989 0
14 아듀이노 부트로더의 개조 [1] avrtools™ 2008/08/28 (목) 5667 0
13 아듀이노 병렬포트 굽기장치 avrtools™ 2008/08/26 (화) 4084 0
12 아듀이노 POV #1 avrtools™ 2008/08/26 (화) 3387 0
11 아듀이노 MIDI 드럼 leeky 2008/08/24 (일) 4621 0
10 아듀이노 SD/MMC 카드 avrtools™ 2008/08/24 (일) 9658 0
9 아듀이노 MIDI 플륫 avrtools™ 2008/08/24 (일) 3462 0
8 아듀이노 RGB LED avrtools™ 2008/08/23 (토) 4901 0
7 아듀이노 USB 오실로스코프 [2] leeky 2008/08/21 (목) 6286 0
6 가속도계 ADXL202 응용소스 avrtools™ 2008/08/20 (수) 4773 0
5 아듀이노 가속도센서 avrtools™ 2008/08/18 (월) 4744 0
4 아듀이노 RC서보 제어 avrtools™ 2008/08/17 (일) 5078 0
3 아듀이노 910-ISP 만들기 avrtools™ 2008/08/16 (토) 4590 0
2 아듀이노 온도센서, XBee 송수신 avrtools™ 2008/08/15 (금) 7344 0
1 아듀이노 기본명령 avrtools™ 2008/08/07 (목) 6421 0
1

바구니 : 0
 보관함 : 0
오늘뷰 : 0
HOME   |   회사소개   |   제휴안내   |   회사위치   |   서비스이용 약관   |   개인정보 보호정책   |   사이트맵
17015 경기도 용인시 기흥구 동백중앙로16번길 16-25, 508호. 전화 : 031-282-3310
사업자 등록번호 : 697-47-00075 / 대표 : 이건영 / 업태 : 제조업 / 종목 : LED조명, LED전원, 제어장치.
개인정보 관리책임자 : 홈페이지 관리자 . Copyright ⓒ2016 아크레즈 (ACLEDS INC.)
HOME TOP PREVNEXT 0 0 0