上位机的poke()、peek()、写SPI函数实现以及控制信息的发送(VRT Context包)

lib/usrp/common/fifo_ctrl_excelsior.cpp

 /*******************************************************************
     * Peek and poke 32 bit implementation
     ******************************************************************/
    void poke32(wb_addr_type addr, boost::uint32_t data){
        boost::mutex::scoped_lock lock(_mutex);

        this->send_pkt(addr, data, POKE32_CMD);//调用send_pkt,打包成VRT  context包

        this->wait_for_ack(_seq_out-MAX_SEQS_OUT);
    }

    boost::uint32_t peek32(wb_addr_type addr){
        boost::mutex::scoped_lock lock(_mutex);

        this->send_pkt(addr, 0, PEEK32_CMD);

        return this->wait_for_ack(_seq_out);
    }

/*******************************************************************
     * FIFO controlled SPI implementation
     ******************************************************************/
    void init_spi(void){
        boost::mutex::scoped_lock lock(_mutex);

        this->send_pkt(SPI_DIV, SPI_DIVIDER, POKE32_CMD);
        this->wait_for_ack(_seq_out-MAX_SEQS_OUT);

        _ctrl_word_cache = 0; // force update first time around
    }

    boost::uint32_t transact_spi(
        int which_slave,
        const spi_config_t &config,
        boost::uint32_t data,
        size_t num_bits,
        bool readback
    ){
        boost::mutex::scoped_lock lock(_mutex);

        //load control word
        boost::uint32_t ctrl_word = 0;
        ctrl_word |= ((which_slave & 0xffffff) << 0);
        ctrl_word |= ((num_bits & 0x3ff) << 24);
        if (config.mosi_edge == spi_config_t::EDGE_FALL) ctrl_word |= (1 << 31);
        if (config.miso_edge == spi_config_t::EDGE_RISE) ctrl_word |= (1 << 30);

        //load data word (must be in upper bits)
        const boost::uint32_t data_out = data << (32 - num_bits);

        //conditionally send control word
        if (_ctrl_word_cache != ctrl_word){
            this->send_pkt(SPI_CTRL, ctrl_word, POKE32_CMD);
            this->wait_for_ack(_seq_out-MAX_SEQS_OUT);
            _ctrl_word_cache = ctrl_word;
        }

        //send data word
        this->send_pkt(SPI_DATA, data_out, POKE32_CMD);
        this->wait_for_ack(_seq_out-MAX_SEQS_OUT);

        //conditional readback
        if (readback){
            this->send_pkt(_config.spi_rb, 0, PEEK32_CMD);
            return this->wait_for_ack(_seq_out);
        }

        return 0;
    }

/*******************************************************************
     * Primary control and interaction private methods
     ******************************************************************/
    UHD_INLINE void send_pkt(wb_addr_type addr, boost::uint32_t data, int cmd){
        managed_send_buffer::sptr buff = _xport->get_send_buff();
        if (not buff){
            throw uhd::runtime_error("fifo ctrl timed out getting a send buffer");
        }
        boost::uint32_t *pkt = buff->cast<boost::uint32_t *>();

        //load packet info,打包成VRT协议包
        vrt::if_packet_info_t packet_info;
        packet_info.packet_type = vrt::if_packet_info_t::PACKET_TYPE_CONTEXT;
        packet_info.num_payload_words32 = 2;
        packet_info.num_payload_bytes = packet_info.num_payload_words32*sizeof(boost::uint32_t);
        packet_info.packet_count = ++_seq_out;
        packet_info.tsf = _time.to_ticks(_tick_rate);
        packet_info.sob = false;
        packet_info.eob = false;
        packet_info.has_sid = false;
        packet_info.has_cid = false;
        packet_info.has_tsi = false;
        packet_info.has_tsf = _use_time;
        packet_info.has_tlr = false;

        //load header
        vrt::if_hdr_pack_le(pkt, packet_info);

        //load payload
        const boost::uint32_t ctrl_word = (addr/4 & 0xff) | cmd | (_seq_out << 16);
        pkt[packet_info.num_header_words32+0] = uhd::htowx(ctrl_word);
        pkt[packet_info.num_header_words32+1] = uhd::htowx(data);

        //send the buffer over the interface
        buff->commit(sizeof(boost::uint32_t)*(packet_info.num_packet_words32));
    }

usrp2_iface.cpp:

/***********************************************************************
 * Peek and Poke
 **********************************************************************/
    void poke32(wb_addr_type addr, boost::uint32_t data){
        this->get_reg<boost::uint32_t, USRP2_REG_ACTION_FPGA_POKE32>(addr, data);
    }

    boost::uint32_t peek32(wb_addr_type addr){
        return this->get_reg<boost::uint32_t, USRP2_REG_ACTION_FPGA_PEEK32>(addr);
    }

    void poke16(wb_addr_type addr, boost::uint16_t data){
        this->get_reg<boost::uint16_t, USRP2_REG_ACTION_FPGA_POKE16>(addr, data);
    }

    boost::uint16_t peek16(wb_addr_type addr){
        return this->get_reg<boost::uint16_t, USRP2_REG_ACTION_FPGA_PEEK16>(addr);
    }

    void pokefw(wb_addr_type addr, boost::uint32_t data)
    {
        this->get_reg<boost::uint32_t, USRP2_REG_ACTION_FW_POKE32>(addr, data);
    }

    boost::uint32_t peekfw(wb_addr_type addr)
    {
        return this->get_reg<boost::uint32_t, USRP2_REG_ACTION_FW_PEEK32>(addr);
    }

    template <class T, usrp2_reg_action_t action>
    T get_reg(wb_addr_type addr, T data = 0){
        //setup the out data
        usrp2_ctrl_data_t out_data = usrp2_ctrl_data_t();
        out_data.id = htonl(USRP2_CTRL_ID_GET_THIS_REGISTER_FOR_ME_BRO);
        out_data.data.reg_args.addr = htonl(addr);
        out_data.data.reg_args.data = htonl(boost::uint32_t(data));
        out_data.data.reg_args.action = action;

        //send and recv
        usrp2_ctrl_data_t in_data = this->ctrl_send_and_recv(out_data, MIN_PROTO_COMPAT_REG);
        UHD_ASSERT_THROW(ntohl(in_data.id) == USRP2_CTRL_ID_OMG_GOT_REGISTER_SO_BAD_DUDE);
        return T(ntohl(in_data.data.reg_args.data));
    }

/***********************************************************************
 * SPI
 **********************************************************************/
    boost::uint32_t transact_spi(
        int which_slave,
        const spi_config_t &config,
        boost::uint32_t data,
        size_t num_bits,
        bool readback
    ){
        static const uhd::dict<spi_config_t::edge_t, int> spi_edge_to_otw = boost::assign::map_list_of
            (spi_config_t::EDGE_RISE, USRP2_CLK_EDGE_RISE)
            (spi_config_t::EDGE_FALL, USRP2_CLK_EDGE_FALL)
        ;

        //setup the out data
        usrp2_ctrl_data_t out_data = usrp2_ctrl_data_t();
        out_data.id = htonl(USRP2_CTRL_ID_TRANSACT_ME_SOME_SPI_BRO);
        out_data.data.spi_args.dev = htonl(which_slave);
        out_data.data.spi_args.miso_edge = spi_edge_to_otw[config.miso_edge];
        out_data.data.spi_args.mosi_edge = spi_edge_to_otw[config.mosi_edge];
        out_data.data.spi_args.readback = (readback)? 1 : 0;
        out_data.data.spi_args.num_bits = num_bits;
        out_data.data.spi_args.data = htonl(data);

        //send and recv
        usrp2_ctrl_data_t in_data = this->ctrl_send_and_recv(out_data, MIN_PROTO_COMPAT_SPI);
        UHD_ASSERT_THROW(ntohl(in_data.id) == USRP2_CTRL_ID_OMG_TRANSACTED_SPI_DUDE);

        return ntohl(in_data.data.spi_args.data);
    }

/***********************************************************************
 * I2C
 **********************************************************************/
    void write_i2c(boost::uint16_t addr, const byte_vector_t &buf){
        //setup the out data
        usrp2_ctrl_data_t out_data = usrp2_ctrl_data_t();
        out_data.id = htonl(USRP2_CTRL_ID_WRITE_THESE_I2C_VALUES_BRO);
        out_data.data.i2c_args.addr = addr;
        out_data.data.i2c_args.bytes = buf.size();

        //limitation of i2c transaction size
        UHD_ASSERT_THROW(buf.size() <= sizeof(out_data.data.i2c_args.data));

        //copy in the data
        std::copy(buf.begin(), buf.end(), out_data.data.i2c_args.data);

        //send and recv
        usrp2_ctrl_data_t in_data = this->ctrl_send_and_recv(out_data, MIN_PROTO_COMPAT_I2C);
        UHD_ASSERT_THROW(ntohl(in_data.id) == USRP2_CTRL_ID_COOL_IM_DONE_I2C_WRITE_DUDE);
    }

    byte_vector_t read_i2c(boost::uint16_t addr, size_t num_bytes){
        //setup the out data
        usrp2_ctrl_data_t out_data = usrp2_ctrl_data_t();
        out_data.id = htonl(USRP2_CTRL_ID_DO_AN_I2C_READ_FOR_ME_BRO);
        out_data.data.i2c_args.addr = addr;
        out_data.data.i2c_args.bytes = num_bytes;

        //limitation of i2c transaction size
        UHD_ASSERT_THROW(num_bytes <= sizeof(out_data.data.i2c_args.data));

        //send and recv
        usrp2_ctrl_data_t in_data = this->ctrl_send_and_recv(out_data, MIN_PROTO_COMPAT_I2C);
        UHD_ASSERT_THROW(ntohl(in_data.id) == USRP2_CTRL_ID_HERES_THE_I2C_DATA_DUDE);
        UHD_ASSERT_THROW(in_data.data.i2c_args.addr = num_bytes);

        //copy out the data
        byte_vector_t result(num_bytes);
        std::copy(in_data.data.i2c_args.data, in_data.data.i2c_args.data + num_bytes, result.begin());
        return result;
    }
时间: 2024-10-31 10:21:38

上位机的poke()、peek()、写SPI函数实现以及控制信息的发送(VRT Context包)的相关文章

有没有c#写上位机的教程,写上位机应该不需要知道太多吧,

问题描述 有没有c#写上位机的教程,写上位机应该不需要知道太多吧, 还请大师指点一二,拖动一些工具没什么难点主要是程序新手有些是第一次见,谢谢 解决方案 没有什么上位机的教程.上位机除了在逻辑上处于和下位机通讯的地位外,没有任何共通点,它可以很简单,可以很复杂.你需要知道的无非也就是用C#开发的一般知识. 需要知道多少取决于你的程序需要做什么,有什么功能. 一个上位机程序典型的需要两个部分,一个是和下位机的接口部分.和下位机通讯,可以通过网络,串口,第三方的库,文件交换等. 一个是上位机对数据本

控件-求大神帮忙写个函数,以控制datagrideview行列变化

问题描述 求大神帮忙写个函数,以控制datagrideview行列变化 2C 我做一个小程序,里面用到了很多数据库和Datagriedview控件,希望写一个全局函数,控制datagridview的行列宽度变化,以及插入和删除行或列(点击鼠标右键时出现插入和删除行列.以及复制粘贴). 在调用数据库后,能不能实现对数据的多行粘贴和复制. 谢谢了,急求. 解决方案 http://bbs.csdn.net/topics/360108393 解决方案二: 设置datagridview行列格式的函数呢?

窗口句柄-C#写一款ip摄像头上位机,用RealPlayWnd.Handle;为啥是无效的句柄

问题描述 C#写一款ip摄像头上位机,用RealPlayWnd.Handle;为啥是无效的句柄 20C 我在用C#做某款小众摄像头的二次开发,写成功过海康产品的上位机,但是这款一直遇到一个问题困扰着我! 给的Demo用的是C++语言,我选择C#开发,在成功调用了初始化函数和登录设备函数后(说明给的dll是对的),调用打开通道Client_OpenChannel(OPEN_INFO *pOpenInfo)函数却一直无法实现. 我是这样写的: 一直返回无效句柄的意思. 厂家给的Demo里是这样写的:

用c#写的上位机 通过socket从下位机得到数据汇成折线图

问题描述 我打算用c#写上位机通过socket接收下位机传来的温度湿度光照强度的数据需要接收这些数据然后分别绘制成温度曲线图湿度曲线图光照强度曲线图我想问问各位大神socket接收的数据格式是怎么样的能把接收的这些数据区分开哪个是温度的数据哪个湿度数据然后采用什么样的方法能分别接收数据同时绘制成三张曲线图 解决方案 解决方案二:socket接收的数据格式是怎么样的取决于你和下位机开发者的约定.解决方案三:那对不同数据怎么区分像温度和光照解决方案四:不同的传感器会有不同的地址码,比如温度地址是00

用C#在visual studio 2010写上位机,时序图的问题

问题描述 RT,本人去年毕业,现在工作需要在visualstudio2010下用C#写一个上位机,其中一部分功能需要写一个几个接触器随时间变化的开关状态,我想用chart控件画一个曲线图,但是在固定X轴数据的情况下的还会写,后来导师让我用System.DateTime.Now中的时间数据做X轴,配合读取到的数据来作图,但是出现很多问题,比如图显示不出来什么的,想请教各位大神有没有知道怎么回事,或者有这一块相关的学习资料能提供的,小弟感激不尽~~~~ 解决方案 解决方案二:要么用Timer,要么在

bms-编写一个上位机来处理modbus协议过来的数据,需要用什么平台,学习什么知识

问题描述 编写一个上位机来处理modbus协议过来的数据,需要用什么平台,学习什么知识 化学转行过来的,这算是第一个任务.这两个星期学了C语言和C++,以及一些简单的计算机原理.下面是电池保护板,要提取出温度,电压,电流这几种数据.身边没有人教,学习起来没有方向.希望大家解惑一下. 解决方案 你是想知道处理modbus协议过来的数据,还是提取出温度,电压,电流这几种数据呢?modbus协议的处理还是比较简单的,可参考:Modbus通讯协议 Modbus协议中文版[完整版] 提取出温度,电压,电流

fx- FX2N系列PLC通过编程口如何与上位机实现串口通信

问题描述 FX2N系列PLC通过编程口如何与上位机实现串口通信 新人,最近在写一个MFC的控制台,实现与PLC串口通信,以前写的是实现与avr单片机的通信.我按照三菱特有的通信格式编写,不知为啥一直无法实现,哪位前辈有这方面的经验吗?诚心求指点. 比如: 1.上位机发请求讯号(05H)给PLC,上位机只要负责把它发到串口缓冲区就可以吗? 2.在上位机收到PLC返回的确认信号(ACK)后,发后面的多字符帧命令码(02 45 31 30 34 30 30 34 30 32 37 42 30 30 0

显示-stm32与上位机通过网口通信,网口读不出数据?

问题描述 stm32与上位机通过网口通信,网口读不出数据? 使用w5500evb与上位机通信,w5500evb是一个网络芯片,它的MCU是stm32f103系列的,要实现将传感器采集到的数据值通过网口显示在上位机的网络调试助手上,现在我可以通过串口将数据显示在串口调试助手上(说明传感器工作正常),但是通过网口传数据时,在上位机的网络调试助手不显示,请教大神,这是什么原因呢?(网络通信是正常的,我用上位机的网络调试助手给下位机发送数据123,下位机收到之后会自动将123发送给上位机,而且在网络调试

stm32不停地发送一个字节的数据,mfc编写的上位机接收到了但是显示乱码

问题描述 stm32不停地发送一个字节的数据,mfc编写的上位机接收到了但是显示乱码 用MFC写了一个串口接收的函数,为了测试,单片机stm32每隔一秒不停地发送同一个数,比如是0x32,想显示在接收框里面,但是每次显示都是乱码,如果以16进制显示就是8位16进制码. 设置断点调试了一下,发现bt是成功接收到了的,但是以cstring显示就乱码了,为什么呢? 代码如下: void C无人机地面控制终端Dlg::OnCommMscomm1() { // TODO: 在此处添加消息处理程序代码 VA