ネコと和解せよ

LPC1769で遊んでます。(3)

SDカードをつなげてます。FatFsを使って、VCOM経由でモニタを動かすのが目標です。

イメージ

現実


工作編

ソフト編

プロジェクトは、このまえ作ったFreeRTOSを使いました。

  • NXP_app_note_an10916 - 32bitmicro - 32 bit microcontroller (MCU) support - Google Project HostingからAN10916 FAT library EFSL and FatFs port on NXP LPC1700 (with software) V1 (Mar 4, 2010) をダウンロードします。
  • zipの中のLPC1700_FatFs_Prjから、必要なファイルをプロジェクトへコピーします。ファイルリストは、以下の通り。nylpcの下とSDFSの下に分かれてます。main_sd.cは、FATFSのmain.cをリネームした物です。

  • main_sd.cの初期化コードがエラーを出すので、IoInit関数をコメントアウトして、main_sd.cの初期化コードを削除します。
/*main_sd.c*/
//IoInitを削除


int test_sd () //mnain.cを改名
{
	char *ptr, *ptr2;
	long p1, p2, p3;
	FRESULT f_res;
	DRESULT d_res;
	BYTE b1;
	WORD w1;
	UINT s1, s2, cnt; 
	DWORD ofs = 0, sect = 0;
	FATFS *fs;				/* Pointer to file system object */
	RTCTime rtc;

//	IoInit();//ここいらない。

	//xputs("\nFatFs module test monitor for LPC17xx " VERSION_STRING "\n");
    xputs("\nFatFs module test monitor for LPC17xx (" __DATE__  __TIME__ ")\n");
:
  • monitor.hをVCOM経由に切り替えます。
/*monitor.h*/
#include <stdint.h>


#define xgetc()		(char)VCOM_getchar() //ここ
#define uart0_put(x)	(char)VCOM_putchar(x) //ここ
:
  • で、USBCDC.cのUSBタスクを書き変えて、モニタプログラムを呼ぶようにします。このままだとUSBタスクのスタックが足りないので、main.cのmain関数を書き変えて、とりあえず160くらいに増やします。
/*USB_CDC.c*/
:
	DBG("Connecting to USB bus\n");
	USBHwConnect(TRUE);
	test_sd();
	// echo any character received (do USB stuff in interrupt)
	for( ;; )
:
/*main.c*/
:
    vStartRecursiveMutexTasks();
	vStartLEDFlashTasks( mainFLASH_TASK_PRIORITY );

    //USBタスクの開始
    xTaskCreate( vUSBTask, ( signed char * ) "USB", 160, ( void * ) NULL, tskIDLE_PRIORITY, NULL );
	
	/* Display the IP address, then create the uIP task.  The WEB server runs 
	in this task. */
	LCDdriver_initialisation();
:
  • あとちょこちょこリンクエラーやら参照エラーが起こるので、その辺を直します。

テスト

  • 配線を確認して、電源を入れます。
  • 起動したら、USB経由のVCOMでモニタプログラムを操作します。
  • di → ds でSDカードが読めれば、多分OKです。


古い16MBのSDカードでテストしたときには、さっぱり認識しませんでした。新し目の1〜2GBくらいのSDカードが良いと思います。

ソース

GoogleCodeにあります。リビジョンは8です。
https://nylpc-freertos.googlecode.com/svn