• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 博客專欄

    EEPW首頁(yè) > 博客 > zynq7020開(kāi)發(fā)記錄(持續(xù)更新)--SPI編譯、配置和使用

    zynq7020開(kāi)發(fā)記錄(持續(xù)更新)--SPI編譯、配置和使用

    發(fā)布人:電子禪石 時(shí)間:2024-02-03 來(lái)源:工程師 發(fā)布文章

    1706960214369416.png

    set_property PACKAGE_PIN G14   [get_ports SPI0_MISO]
    set_property IOSTANDARD LVCMOS33 [get_ports SPI0_MISO]
    
    set_property PACKAGE_PIN J15  [get_ports SPI0_MOSI]
    set_property IOSTANDARD LVCMOS33 [get_ports SPI0_MOSI]
    
    set_property PACKAGE_PIN J18   [get_ports SPI0_SCLK]
    set_property IOSTANDARD LVCMOS33 [get_ports SPI0_SCLK]
    
    set_property PACKAGE_PIN L19   [get_ports SPI_CS_tri_o[0]]
    set_property PACKAGE_PIN M17   [get_ports SPI_CS_tri_o[1]]
    set_property PACKAGE_PIN G19   [get_ports SPI_CS_tri_o[2]]
    # set_property PACKAGE_PIN J20   [get_ports SPI_CS_tri_o[3]]
    # set_property PACKAGE_PIN J19   [get_ports SPI_CS_tri_o[4]]  
    # set_property PACKAGE_PIN F16   [get_ports SPI_CS_tri_o[5]]
    # set_property PACKAGE_PIN F17   [get_ports SPI_CS_tri_o[6]]
    set_property IOSTANDARD LVCMOS33 [get_ports SPI_CS_tri_o[*]]


    image.png

    // 對(duì)于 system-top.dts,添加 對(duì)spi1節(jié)點(diǎn)的引用聲明
    aliases {
    		ethernet0 = &gem0;
    		serial0 = &uart1;
    		serial1 = &uart0;
    		spi0 = &qspi;
    		spi1 = &spi0;
    	};
    
    // 對(duì)于 pcw.dtsi,添加對(duì)于 spi1 設(shè)備的描述
    &spi0 {
    	is-decoded-cs = <0>;
    	num-cs = <3>;
    	status = "okay";
    };
    // 上面pcw.dtsi添加并修改成
    &spi0 {
    	// 下面這三行不變
    	is-decoded-cs = <0>;
    	num-cs = <3>;
    	status = "okay";
    
    	device@0 {
    		compatible = "spidev";
    		reg = <0>;
    		spi-max-frequency = <5000000>;
    		#address-cells = <1>;
    		#size-cells = <1>;
        };
    };

      2.修改內(nèi)核配置

    make ARCH=arm CROSS_COMPILE=/usr/local/gcc-linaro-7.5.0-2019.12-x86_64_
    arm-linux-gnueabihf/bin/arm-linux-gnueabihf- menuconfig
    #### 執(zhí)行修改操作
    make ARCH=arm CROSS_COMPILE=/usr/local/gcc-linaro-7.5.0-2019.12-x86_64
    _arm-linux-gnueabihf/bin/arm-linux-gnueabihf- all
    
    ## 配置下面兩個(gè)宏使之生效
    CONFIG_SPI_CADENCE = y
    CONFIG_SPI_SPIDEV = y
    # 并打開(kāi)以下宏
    Device Drivers  --->
    	[*] SPI support  --->
            <*>   Cadence SPI controller
            <*>   Xilinx SPI controllor common module
    		<*>   User mode SPI device driver support

      

    image.png             

    4.測(cè)試

    spi_mio.h 
    
    #ifndef _SPI_MIO_H_
    #define _SPI_MIO_H_
    
    #include <stdint.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <getopt.h>
    #include <fcntl.h>
    #include <sys/ioctl.h>
    #include <linux/types.h>
    #include <linux/spi/spidev.h>
    #include <iostream>
    #include <string>
    #include <cstring>
    #include <fstream>
    #include <sstream>
    #include <queue>
    #include <chrono>
    #include <vector>
    #include <list>
    #include <map>
    #include <numeric> 
    #include <stdexcept>
    #include <utility>
    #include <functional>
    #include <atomic>
    #include <mutex>
    #include <thread> 
    #include <sys/stat.h>           
    #include <sys/types.h>  
    #include <sys/ipc.h>
    #include <sys/msg.h>
    #include <sys/time.h>  
    #include <sys/times.h>        
    #include <unistd.h>                  
    #include <getopt.h>             
    #include <errno.h>  
    #include <sys/mman.h>
    #include <math.h>
    #include <time.h>
    #include <signal.h>
    #include <unistd.h>
    #include <getopt.h>
    #include <sys/ioctl.h>
    #include <linux/types.h>
    #include <linux/fb.h>
    #include <linux/spi/spidev.h>
    #include <termios.h>
    #include <sys/vfs.h>
    #include <mntent.h>
    #include <sys/epoll.h>
    #include <poll.h>
    #include <dirent.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <sys/shm.h>
    
    using namespace std;
    class spi
    {
    private:
        std::string device;
    
        uint32_t mode;
        uint8_t  bits;
        uint32_t speed;
    
    public:
        int fd_spi;
        using ptr = std::shared_ptr<spi>;
    
    public:
        // 默認(rèn)為/dev下的設(shè)備節(jié)點(diǎn),可根據(jù)實(shí)際變化,模式0,一次傳輸8bits, 速率1e6
        spi(std::string device = "/dev/spidev1.0", uint32_t mode = 0, uint8_t  bits = 8, uint32_t speed = 1e6);
        ~spi();
    
        int init();
        int transfer(int fd, uint8_t *tx, uint8_t *rx, uint32_t len);
        void delay(uint32_t count);   
     
    };
    
    class my_dev : public spi
    {
    private:
        uint8_t my_dev_register_config[3] = {0x01, 0x00, 0x34};
    public:
        using spi::spi;
        my_dev() {}
        ~my_dev() {}
    
        void my_dev_init();
    };
    
    #endif

    spi_mio.cpp
    
    #include "spi_mio.h"
    
    using namespace std;
    
    
    spi::spi(std::string device_, uint32_t mode_, uint8_t  bits_, uint32_t speed_)
    {
        device = device_;
    
        mode = mode_;
        bits = bits_;
        speed = speed_;
    
    	fd_spi = open(device_.c_str(), O_RDWR);
    	if (fd_spi < 0) {
            std::cout << "can't open spi device" << std::endl;
        }
    
        init();
    
    }
    
    spi::~spi()
    {
        if (fd_spi > 0) {
            close(fd_spi);
        }
    }
    
    int spi::init()
    {
        int ret = 0;
        if (fd_spi > 0)
        {
            if (ioctl(fd_spi, SPI_IOC_WR_MODE32, &mode) == -1 ||
                ioctl(fd_spi, SPI_IOC_RD_MODE32, &mode) == -1 ||
                ioctl(fd_spi, SPI_IOC_WR_BITS_PER_WORD, &bits) == -1 ||
                ioctl(fd_spi, SPI_IOC_RD_BITS_PER_WORD, &bits) == -1 ||
                ioctl(fd_spi, SPI_IOC_WR_MAX_SPEED_HZ, &speed) == -1 ||
                ioctl(fd_spi, SPI_IOC_RD_MAX_SPEED_HZ, &speed) == -1)
            {
                std::cout << "spi device init failed" << std::endl;
                return -1;
            }
        }
        return ret;
    }
    
    int spi::transfer(int fd, uint8_t *tx, uint8_t *rx, uint32_t len)
    {
    	int ret = 0;
    
    	struct spi_ioc_transfer tr = {
                                    .tx_buf = (unsigned long)tx,
                                    .rx_buf = (unsigned long)rx,
                                    .len = len, 
                                    // .speed_hz = speed,  
                                    // .bits_per_word = bits,  
                                     };
    
    	ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
    	if (ret < 1){
            std::cout << "can't send spi message" << std::endl;
            return -1;
        }
    	return ret;	
    }
    
    void spi::delay(uint32_t count)
    {
        uint32_t fool = 0;
        while (count--){
           fool++; 
        }
    }
    
    void my_dev::my_dev_init()
    {
        uint8_t recv[8];
    	write(fd_spi, my_dev_register_config, 3);
        // transfer(fd_spi, my_dev_register_config, recv, 3);	// 用于雙向傳輸
    }
    main.cpp
    
    #include "spi_mio.h"
    
    int main()
    {
        my_dev dev1;
        dev1.my_dev_init();
    	return 0;
    }


    原文鏈接:https://blog.csdn.net/Vanau/article/details/122460021


    *博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。



    關(guān)鍵詞: zynq

    相關(guān)推薦

    技術(shù)專區(qū)

    關(guān)閉
    主站蜘蛛池模板: 峡江县| 霞浦县| 得荣县| 册亨县| 闸北区| 天门市| 峨山| 梨树县| 望江县| 朔州市| 曲沃县| 依兰县| 无棣县| 北安市| 横山县| 诸城市| 石家庄市| 芜湖市| 阿瓦提县| 西平县| 吴旗县| 乌拉特中旗| 嵊州市| 渭南市| 滨州市| 津市市| 齐河县| 呼伦贝尔市| 茂名市| 富阳市| 黎川县| 铜鼓县| 龙江县| 西平县| 湟中县| 绥滨县| 崇义县| 安达市| 仙居县| 嘉鱼县| 衡南县|