FC2カウンター FPGAの部屋 Ultra96用PMOD拡張ボードでカメラ入力7(Vivado 2018.2のcam_test_182プロジェクト4)
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

Ultra96用PMOD拡張ボードでカメラ入力7(Vivado 2018.2のcam_test_182プロジェクト4)

Ultra96用PMOD拡張ボードでカメラ入力6(Vivado 2018.2のcam_test_182プロジェクト3)”の続き。

前回は、タイミングエラーを解消し、論理合成、インプリメンテーション、ビットストリームの生成を完了した。今回は、実際にUltra96 に低速コネクタ用PMOD変換基板を取り付け、MT9D111 カメラを取り付けてテストを行う。

最初に、低速コネクタ用PMOD変換基板を取り付けて、そして、インターフェース基板ごとMT9D111 を取り付けた。
写真を示す。
DMA_Write_sFB_49_181116.jpg

Vivado でハードウェアをエクスポートして、EDK を立ち上げた。

EDK が立ち上がった。
DMA_Write_sFB_42_181109.png

cam_test アプリケーション・プロジェクトを作成して、cam_test.c を作成した。
DMA_Write_sFB_43_181115.png

cam_test.c を示す。(2018/11/19 :修正)

/*
 * cam_test.c
 *
 *  Created on: 2018/11/15
 *      Author: masaaki
 */

#include <stdio.h>
#include <stdlib.h>
#include "xil_io.h"
#include "xparameters.h"
#include "sleep.h"
#include "xtime_l.h"

#include "xdma_wirte_sfb.h"

#define FRAME_BUFFER_ADDRESS 0x10000000
#define NUMBER_OF_WRITE_FRAMES  3 // Note: If not at least 3 or more, the image is not displayed in succession.

#define HORIZONTAL_PIXELS   800
#define VERTICAL_LINES      600
#define PIXEL_NUM_OF_BYTES  4

void cam_i2c_init(volatile unsigned *mt9d111_i2c_axi_lites) {
    mt9d111_i2c_axi_lites[64] = 0x2; // reset tx fifo ,address is 0x100, i2c_control_reg
    mt9d111_i2c_axi_lites[64] = 0x1; // enable i2c
}

void cam_i2x_write_sync(void) {
    // unsigned c;

    // c = *cam_i2c_rx_fifo;
    // while ((c & 0x84) != 0x80)
        // c = *cam_i2c_rx_fifo; // No Bus Busy and TX_FIFO_Empty = 1
    usleep(1000);
}

void cam_i2c_write(volatile unsigned *mt9d111_i2c_axi_lites, unsigned int device_addr, unsigned int write_addr, unsigned int write_data){
    mt9d111_i2c_axi_lites[66] = 0x100 | (device_addr & 0xfe);   // Slave IIC Write Address, address is 0x108, i2c_tx_fifo
    mt9d111_i2c_axi_lites[66] = write_addr;
    mt9d111_i2c_axi_lites[66] = (write_data >> 8)|0xff;         // first data
    mt9d111_i2c_axi_lites[66] = 0x200 | (write_data & 0xff);        // second data
    cam_i2x_write_sync();
}

int main(){
    XDma_wirte_sfb dmaw;

    XDma_wirte_sfb_Initialize(&dmaw, 0);
    XDma_wirte_sfb_Set_fb0_V(&dmaw, FRAME_BUFFER_ADDRESS);
    XDma_wirte_sfb_Set_fb1_V(&dmaw, FRAME_BUFFER_ADDRESS);
    XDma_wirte_sfb_Set_fb2_V(&dmaw, FRAME_BUFFER_ADDRESS);
    XDma_wirte_sfb_Start(&dmaw);
    XDma_wirte_sfb_EnableAutoRestart(&dmaw);

    volatile unsigned int *mt9d111_axi_lites;
    volatile unsigned int *mt9d111_i2c_axi_lites;

    mt9d111_axi_lites = (volatile unsigned *)XPAR_MT9D111_INF_AXIS_0_BASEADDR;
    mt9d111_i2c_axi_lites = (volatile unsigned *)XPAR_AXI_IIC_0_BASEADDR;

    mt9d111_axi_lites[0] = (volatile unsigned int)FRAME_BUFFER_ADDRESS; // Camera Interface start (Address is dummy)

    // CMOS Camera initialize, MT9D111
    cam_i2c_init(mt9d111_i2c_axi_lites);

    cam_i2c_write(mt9d111_i2c_axi_lites, 0xba, 0xf0, 0x1);      // Changed regster map to IFP page 1
    cam_i2c_write(mt9d111_i2c_axi_lites, 0xba, 0x97, 0x20);     // RGB Mode, RGB565

    mt9d111_axi_lites[1] = 0; // One_shot_mode is disabled

}


EDK のXilinx メニューからProgram FPGA を選択して、Ultra96 のFPGA 部分をコンフィギュレーションした。
DMA_Write_sFB_44_181115.png

DMA_Write_sFB_45_181115.png

cam_test プロジェクトのBinaries -> cam_test.elf を右クリックし、右クリックメニューから Run As -> Launch on Hardware (System Debugger) を選択して、アプリケーションを起動した。正常に起動できた。
DMA_Write_sFB_46_181115.png

Vivado Analyzer を開いた。
DMA_Write_sFB_47_181115.png

AXI4-Stream と AXI4-Master のプロトコルを観察したところ、トランザクションが無かった。
DMA_Write_sFB_48_181115.png

これだけでは、よく分からないので、オシロスコープでクロックが出ているか?カメラの信号が出ているか?を見ることにする。
  1. 2018年11月16日 04:58 |
  2. Ultra96
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
https://marsee101.blog.fc2.com/tb.php/4356-2e7a39de
この記事にトラックバックする(FC2ブログユーザー)