読者です 読者をやめる 読者になる 読者になる

日曜技術者のメモ

趣味でやった事のメモ書きです。

Zedboard SPIで通信してみた -2- (未完成)

FPGA ZedBoard

続きから

6.ソフトウェア開発
 前回と同じ様にPlanAheadからSDKを呼び出し「Hello World」のCプロジェクトを作成する。
 作成後「system.mss」のタブにps7_spi_1という項目がある。
 Xilinxが用意したドライバがあり、そのドキュメントとサンプルがそこにある。

f:id:ginnyu-tei:20121002220145g:plain

 サンプルを参考に書いたソースが↓
まずテストという事で気圧センサへ0x88を送信します。
 信号はロジアナで観測し出力波形を確認します。
 (行数がかなり長くなったのでソースのコメントを削除しています)

#include <stdio.h>
#include "platform.h"
#include "xspips.h"		/* SPI device driver */

#include "xparameters.h"
static XSpiPs SpiInstance;

#define SPI_DEVICE_ID		XPAR_XSPIPS_0_DEVICE_ID

void print(char *str);

int SpiPsEepromPolledExample(XSpiPs *SpiInstancePtr, u16 SpiDeviceId);

int main()
{
	int Status;
    init_platform();

    print("Hello World\n\r");

	Status = SpiPsEepromPolledExample(&SpiInstance, SPI_DEVICE_ID);
	if (Status != XST_SUCCESS) {
		print("SPI EEPROM Polled Mode Example Test Failed\r\n");
		return XST_FAILURE;
	}

    cleanup_platform();

    return 0;
}

int SpiPsEepromPolledExample(XSpiPs *SpiInstancePtr, u16 SpiDeviceId)
{
	int Status;
	 unsigned char   	SendData;
	 unsigned char   	RecvData;
	 volatile unsigned int	*hoge;
	 u32 StatusReg;
	 XSpiPs_Config *SpiConfig;

	SpiConfig = XSpiPs_LookupConfig(SpiDeviceId);
	if (NULL == SpiConfig) {
		return XST_FAILURE;
	}

	Status = XSpiPs_CfgInitialize(SpiInstancePtr, SpiConfig,
				       SpiConfig->BaseAddress);
	if (Status != XST_SUCCESS) {
		return XST_FAILURE;
	}

	Status = XSpiPs_SelfTest(SpiInstancePtr);
	if (Status != XST_SUCCESS) {
		return XST_FAILURE;
	}

	XSpiPs_SetOptions(SpiInstancePtr, XSPIPS_MASTER_OPTION |
			   XSPIPS_FORCE_SSELECT_OPTION);

	XSpiPs_SetClkPrescaler(SpiInstancePtr, XSPIPS_CLK_PRESCALE_8);

	XSpiPs_SetSlaveSelect(SpiInstancePtr, 0x0);

	SendData = 0x88;

	XSpiPs_PolledTransfer(SpiInstancePtr, &SendData, NULL,sizeof(SendData));

	return XST_SUCCESS;
}

7.テスト
 Zedboardの電源を入れPCとUSBを接続する。(ここもチュートリアルと同じ)
 Program FPGAFPGAにBitStreamを書き込む。書き込みが終了するとZedBoardの青色LEDが点灯する。
 TeraTermを起動してRun Configurearionを設定して実行。

以上で動作するはずであるがロジアナで観測してもSPI信号が出力されない。
今のところ考えられるのが以下点だと思う。

gccの最適化でプログラムがおかしくなった?(オプティマイズの設定が見つからないので不明)
・SPIの設定ミス
・ピン接続の間違い

困った事に何度かやり直してるとたまに信号が動く時があるが再現性が全くなく現在問題の切り分けが出来ない。
(クロックしか出なかったり、クロックのデューティ比がおかしくパルス信号になってたり・・・)

次ブログ更新する時は動いたよっ!って書きたい・・・