TI E2E™ 设计支持论坛将于 5 月 30 日至 6 月 1 日进行维护。如果您在此期间需要技术支持,请联系 TI 的客户支持中心寻求帮助。

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.

[参考译文] TM4C129ENCPDT:通过 SPI 与 AD7793通信

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/779537/tm4c129encpdt-communicating-with-ad7793-via-spi

器件型号:TM4C129ENCPDT

我正在尝试通过 SPI 使用 AD7793 3chan ADC 芯片设置 TM4C129ENCPDT。  该设计需要在总线上使用其中的两个芯片、在总线结构中、我将控制 SPI CS 线路之外的芯片选择线路、以指示我要与哪个芯片通信。  目前、我可以在示波器上看到我正在发送数据、根据我发送的内容、我可以看到信息到达 RX 引脚。  但是、我无法将数据输入 Tiva 芯片。

AD7793需要先向芯片发送命令消息、然后才能使用其数据寄存器中的值进行响应。  它看起来类似于 MICROWIRE 格式、但声称能够与 SPI、MICROWIRE、QSPI 和3Wire 格式配合使用。  我已经尝试使用多种格式以及 HWREG 命令和 spi.h 命令、但无法找到正确的设置来读取意思是完整信息。  我甚至无法读取 ID 寄存器。   我附加了我为与此芯片通信而编写的设置和数据获取函数。  如果您有任何想法、或者之前曾使用过此 ADC 芯片、请告诉我我缺少的内容。

谢谢、

~ Andrew

..................................................................................................

向 COM 寄存器写入0x60应该为我提供0x0B 的响应。  

bool ctrlCS 允许我根据我尝试执行的操作来设置或不设置 CS 线路。  对于 ID、我将在 spiDataGet 函数中设置 CS。  

uint8_t SpiADC::spiDataGet (uint8_t reg、uint8_t*数据、uint8_t DATA_SIZE、bool ctrlCS)

   //将寄存器写入 SPI 端口
   uint32_t data32[5]={0x00、0x00、0x00、0x00、0x00、0x00};
   uint32_t data32_size = 5;

   if (ctrlCS)
       cs_low();

   SSIDataPut (SSI0_BASE、0x60);
   SSIDataGet (SSI0_BASE、data32);

   while (SSIBusy (SSI0_BASE));

   if (ctrlCS)
       CS_HIGH ();


   for (int i = i;0;<data32_size;i++)
   {
       data[i]= data32[i];//static_cast (* data32ptr);
   }

   data_size = data32_size;


   返回 DATA_SIZE;

静态空 init_spi()

       //********
       //SSI0
       //********

       //设置 SSI 外设
       SysCtlPeripheralEnable (SYSCTL_Periph_SSI0);
       while (!SysCtlPeripheralReady (SYSCTL_Periph_SSI0));

       //设置 GPIO A 块
       SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);

       while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOA));

       //设置 GPIO N 块
       SysCtlPeripheralEnable (SYSCTL_Periph_GPION);
       while (!SysCtlPeripheralReady (SYSCTL_Periph_GPION));

       //将相应的管脚配置为 SSI 而不是 GPIO。
       GPIOPinConfigure (GPIO_PA2_SSI0CLK);
       GPIOPinConfigure (GPIO_PA3_SSI0FSS);
       GPIOPinConfigure (GPIO_PA4_SSI0XDAT0);      //SSIOTX
       GPIOPinConfigure (GPIO_PA5_SSI0XDAT1);      //SSIORX

       GPIOPinTypeSSI (GPIO_Porta_base、GPIO_PIN_2 | GPIO_PIN_3 |
                                       GPIO_PIN_4 | GPIO_PIN_5);

       //为独立的 SSI 线路配置适当的引脚
       GPIOPinTypeGPIOOutput (GPIO_PORTN_BASE、GPIO_PIN_0);        /24V CS       (开发板5V)
       GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0、GPIO_PIN_0);      //设置为高电平

       GPIOPinTypeGPIOOutput (GPIO_PORTN_BASE、GPIO_PIN_1);        //5V CS        (开发板24V)
       GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、GPIO_PIN_1);      //设置为高电平

       SSIClockSourceSet (SSI0_BASE、SSI_CLOCK_SYSTEM);

       SSIConfigSetExpClk (SSI0_BASE、              // SSI 模块基地址
                              G_SysClock、             // 120MHz 系统时钟
                              SSI_FRF_MOTO_MODE_3、    //数据传输协议(CPOL = 1 | CPHA = 1)       模式3
                              SSI_MODE_MASTER、        //运行模式
                              2000000、                //时钟速率(用于传输?)      FSSI >= 2*比特率 (最小2MHz)
                              8//每帧传输的位数
                             );

       SSIAdvModeSet (SSI0_BASE、SSI_ADV_MODE_LEGACY_LEGACGANIC);        //将 SSI 设置为 Legacy

       //启用 SSI0模块。
       SSIEnable (SSI0_BASE);


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

    e2e.ti.com/.../AD7792_5F00_7793.pdf

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    函数 SSIDataPut()发出0x60,但函数 SSIDataGet ()只读取 FIFO 缓冲区中的内容。 如果您使用逻辑分析仪查看 SSI 线路、则只会看到8个时钟脉冲。 您需要使用数据0x60调用 SSIDataPut ()来写入通信寄存器,然后调用 SSIDataGet (),只会占用在前8个时钟期间计时的虚拟数据的 FIFO。 使用虚拟数据对 SSIDataPut ()的第二次调用会生成另外8个时钟脉冲以实际读取 ID 寄存器。 然后,对 SSIDataGet ()的第二次调用将返回 ID 值。