This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] DAC61404:读写寄存器

Guru**** 1178510 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1046157/dac61404-read-and-write-register

器件型号:DAC61404

写入 NOP 寄存器00ABCD
---- 读取 NOP 寄存器80ABCD
---- 读取  NOP 寄存器800000
---- 读取  NOP 寄存器800000

??误差

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    每个读取周期需要两条命令、

    1.读取命令访问;设置读取寄存器地址   

    2.虚拟读取周期;从先前设置的地址读回数据  

    在您的情况下,需要获取第2个和第3个数据读取 NOP。  

    1.将要读回的寄存器地址写入 NOP

    2.发出读取 NOP 以获取数据。

    希望它能澄清您的疑问。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我读取它三次、但 返回的值为 800000

    我已通过 80ABCD

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    共享代码  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    FPGA Nios II

    SPI 模式1

    SPI CLK 1MHz

    //------ 写入 NOP ---
    ADDR = 0x00;
    数据= 0xabcd;
    isWrite = 1;
    RET = pkgCmd (addr、data、isWrite);
    printf ("写NOP寄存器%06X\n"、(unsigned int) ret);

    TX_DATA_ARRAGE[0]= RET;
    RX_DATA_ARRAGE[0]= 0x000000;
    SPI_OLED_WR (TX_DATA_ARRAY、RX_DATA_ARRAY、len);

    //-------- 从 NOP 读取---
    isWrite = 0;
    地址= 0x00;//μ s
    RET = pkgCmd (addr、data、isWrite);
    TX_DATA_ARRAGE[0]= RET;
    RX_DATA_ARRAGE[0]= 0x000000;
    SPI_OLED_WR (TX_DATA_ARRAY、RX_DATA_ARRAY、len);
    SPI_OLED_WR (TX_DATA_ARRAY、RX_DATA_ARRAY、len);
    printf ("------ 读 NOP 寄存器%06X\n"、(无符号整型)(Rx_DATA_ARRAGE[0]);

    /**
    * SPIWrite 功能
    *
    void SPI_OLED_WR (alt_u32* TX_DATA、alt_u32* Rx_DATA、int len){
    WIFI_SPI_COMMAND_PC (SPI_CTRL_CARD_BASE、0、len、TX_DATA、len、 RX_DATA、0);
    /* alt_Avalon SPI_COMMAND (SPI_CTRL_CARD_BASE、0、
    len、TX_DATA、len、Rx_DATA、0);*/

    //封装 CMD

    alt_u32 pkgCmd (alt_u8 addr、alt_U16 data、int isWrite){
    alt_u32 ret = 0x000000;
    RET =(addr << 16)| DATA;//8 + 16 = 24位 Ω
    if (isWrite = 1){
    写操作 最高位置0 μ s
    RET = RET & 0x7ffff;
    }否则{
    //读操作 最高位置1 1000 0000 ff ff ff ff ff ff
    RET = RET | 0x800000;

    回程;
    };

    ///------------------------ SPI func-------------------------------------------------------

    /*********
    **
    *许可协议*
    *作者:PC
    * pcjiushizhu@qq.com
    秘书长的报告 /

    #include "alt_types.h"
    #include "wifi SPI_base.h"
    #include "altera_Avalon SPI_regs.h"
    #include "altera_Avalon PIO_regs.h"
    #include "io.h"
    #include "system.h"
    #include // usleep()

    #define READ_NOW
    #define delay 1.

    int wi_spi_command_pc (alt_u32 base、alt_u32 slave、
    alt_u32 write_length、alt_u32 * write_data、
    alt_u32 read_length、alt_u32 * read_data、
    alt_u32标志)

    const alt_u32 * write_end = write_data + write_length;

    alt_u32状态;


    /*警告:如果在多线程中调用此函数,则当前不安全
    *环境中、以上内容必须执行锁定、以确保安全(如果更安全)
    *一个线程打算使用它。
    *

    IOWR_Altera_Avalon SPI_SLAVE_SEL (base、1 << slave);

    /*仅当切换标志未设置时才设置 SSO 位(强制芯片选择)*/
    如果((flags & ALT_Avalon SPI_COMMAND_TOGGLE_SS_N)=0){
    IOWR_Altera_Avalon SPI_CONTROL (base、Altera_Avalon SPI_CONTRAL_SSO_MSK);

    ,增加同步操作,同步线操作,拉高同步头,主程序没有改。2016.5.5 μ s
    IOWR (PIO_SYNC_BASE、0、0x01);

    /*
    *如果 RXDATA 寄存器中存在过时的数据、请将其丢弃
    *之前的通信中断,并且保留了过时的数据
    * Behind 清空rx
    *
    IORD_32DIRECT (base、0);

    /*保持计时,直到所有数据都被处理。 *
    对于(;;){
    //------ 发送数据--------
    执行{
    读SPI的status寄存器= IORD_8DIRECT (base、8);//μ s
    0则等待 while ((status & 0x40)!= 0x40);//TRDY = 1表示txdata寄存器空,可以发起新的一次写入,μ s TRDY =μ s


    if (write_data < write_end){
    IOWR_32DIRECT (base、4、(* write_data));
    write_data++;


    // usleep(10);//如果优化级别高了,就需要延时了。
    //------ 紧接着接收数据------
    执行{
    读SPI的status寄存器= IORD_8DIRECT (base、8);//μ s
    0则等待 while ((status & 0x80)!= 0x80);//RRDY= 1表示rxdata寄存器满,可供读取,Ω RRDY=Ω


    alt_u32 rxdata = IORD_32DIRECT (base、0);
    (* read_data)= rxdata;
    Read_data++;

    如果(WRITE_DATA == WRITE_END)
    中断;

    // usleep(10);//如果优化级别高了,就需要延时了。


    /*等待接口完成传输*/
    操作

    状态= IORD_Altera_Avalon SPI_STATUS (基本);

    while ((status & Altera_Avalon SPI_STATUS_TMT_MSK)=0);

    /*清除 SSO (释放芯片选择),除非调用方要执行此操作
    *继续使用此芯片
    *
    如果((flags & ALT_Avalon SPI_COMMAND_merge)=0){
    // int i=1000,j=1000;
    // for (i=1000;i>0;i--){
    //// for (j=1000;j>0;j--){
    ///;
    ////}
    //}
    IOWR_Altera_Avalon SPI_CONTROL (base、0);
    // usleep(5);

    同步线操作,拉低同步头 μ s
    IOWR (PIO_SYNC_BASE、0、0x00);
    返回 READ_LENGTH;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、我将在查看代码后再向大家回复。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    1读;

    1.将要读回的寄存器地址写入 NOP

    //------ 写入 NOP ---
    ADDR = 0x00;
    数据= 0xabcd;
    isWrite = 1;
    RET = pkgCmd (addr、data、isWrite);
    printf ("写NOP寄存器%06X\n"、(unsigned int) ret);

    TX_DATA_ARRAGE[0]= RET;
    RX_DATA_ARRAGE[0]= 0x000000;
    SPI_OLED_WR (TX_DATA_ARRAY、RX_DATA_ARRAY、len);

    2.虚拟读取周期;从先前设置的地址读回数据  

    //-------- 从 NOP 读取---
    isWrite = 0;
    地址= 0x00;//μ s
    RET = pkgCmd (addr、data、isWrite);
    TX_DATA_ARRAGE[0]= RET;
    RX_DATA_ARRAGE[0]= 0x000000;
    SPI_OLED_WR (TX_DATA_ARRAY、RX_DATA_ARRAY、len);
    SPI_OLED_WR (TX_DATA_ARRAY、RX_DATA_ARRAY、len);
    printf ("------ 读 NOP 寄存器%06X\n"、(无符号整型)(Rx_DATA_ARRAGE[0]);

    二读;

    重复上述步骤1和2

    第3读;

    重复上述步骤1和2

    请在您的代码中尝试上述序列。

    谢谢