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.

[参考译文] CCS/TM4C129ENCPDT:SPI 传输问题

Guru**** 3001220 points

Other Parts Discussed in Thread: TM4C129ENCPDT

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/915489/ccs-tm4c129encpdt-spi-transfer-issue

器件型号:TM4C129ENCPDT

工具/软件:Code Composer Studio

您好!
我将 CCS 9.3与 TI-RTOS 搭配使用。 使用的控制器是 TM4C129ENCPDT。 我尝试通过 SPI 将 AD7616连接到控制器。  要初始化 AD7616、需要通过写入其寄存器来配置寄存器。 它是使用 API 完成的:SPI_Transfer()。 但只有第一个用于 写入的 SPI 传输才会成功。 当我读回寄存器时,只有第一次写入成功。 对于 SPI、我不使用 FSS。 芯片选择配置为 GPIO。  下面是代码段。 我不确定它的硬件 或软件是否有问题。  对于 CCS 9.3、如果 SPI 处于3线模式、是否有任何变化? 我还尝试了:SPI_Open()、第一次传输、SPI_Close()、SPI_Open()、第二次传输、SPI_Close()。 此处也是第二次失败。

en_transferStat_t ADC_Init(){

SPI_Params slaveSpiParams;
en_transferStat_t en_transferOk;
SPI_Params_init (&slaveSpiParams);
slaveSpiParams.mode = SPI_MASTER;

/*将 SPI 句柄初始化为 ADC*/的默认主控器
masterAdc1 = SPI_open (Board_SPI3、NULL);
if (masterAdc1 ==空)
{
System_abort ("初始化 SPI ADC1时 出错");
返回 TRANSFER_FAILURE;
}
其他
{
System_printf ("SPI 初始化 ADC1\n");
}

/*为配置寄存器启动 SPI 传输*/

BL_transferOk = ADC_SPI_WRITE (masterAdc1、CONFIGREG_ADDRESS、U16_command1);

ADC_ReadReg (masterAdc1、CONFIGREG_ADDRESS、pu16_Result);

BL_transferOk = ADC_SPI_WRITE (masterAdc1、range_register、U16_command2);

ADC_ReadReg (masterAdc1、range_register、pu16_Result);


SPI_CLOSE (masterAdc1);

}

/*********
用途:通过 SPI 将数据写入寄存器
参数:masterSpi:SPI 处理程序
U8_regAddress:用于写入数据的寄存器地址
u16_regData:要写入的数据
返回:成功/失败
注意:返回1字节传输状态
秘书长的报告 /
uint8_t ADC_SPI_WRITE (SPI_Handle masterSpi、
uint8_t u8_regAddress、
uint16_t u16_regData)
{
uint8_t au8_buf[2]、u8_ret = 1;

/*安排寄存器地址和数据通过 SPI*/发送
au8_buf[0]= register_write |((u8_regAddress & 0x3F)<< logical_shif_one)|(((U16_regData & MASK_0x100)>> logical_shif_eight);
au8_buf[1]=(U16_regData 和 MASK_0xFF);


SPI_WRITE_AND_READ (masterSpi、au8_Buf、2);
返回 u8_ret;
}

/*********
用途:通过 SPI 从寄存器读取数据或将数据写入寄存器
参数:masterSpi:SPI 处理程序
uint8_t bytes_number :否 要写入的字节数
u16_regData:  
返回:成功/失败
注意:返回1字节传输状态
秘书长的报告 /

uint8_t SPI_WRITE_AND_READ (SPI_Handle masterSpi、
uint8_t *数据、
uint8_t bytes_number)
{

uint32_t i;
uint8_t TX[2];
uint8_t rx[2];

对于(i = 0;i < bytes_number;i++){
TX[i]=数据[i];
}

SPI_Transaction masterTransaction;
masterTransaction.count = bytes_number;
masterTransaction.txBuf =(ptr) TX;
masterTransaction.rxBuf =(ptr) rx;

GPIO_WRITE (ADC_CS、Board_GPIO_OFF);

SPI_transfer (masterSpi、masterTransaction);

GPIO_WRITE (ADC_CS、Board_GPIO_ON);

对于(i = 0;i < bytes_number;i++)
DATA[i]= Rx[i];

返回1;
}

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

    您好!

    您使用的是 LaunchPad 还是定制硬件? 您能否从"Board.c"文件附加 SPI 配置?

    Todd

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

    我正在使用定制板。  我正在使用 SPI3

    /*
    *========================================= SPI ========================================================
    *
    /*放入子段以允许 TI 链接器正确删除项目*/
    #if defined (__TI_Compiler_version__)
    #pragma DATA_SECTION (SPI_CONFIG、".CONST:SPI_CONFIG")
    #pragma DATA_SECTION (spiTivaDMAHWAttrs、".const:spiTivaDMAHWAttrs")
    #endif

    #include
    #include

    SPITivaDMA_Object spiTivaDMAObjects[EK_TM4C129EXL_SPICOUNT];

    #if defined (__TI_Compiler_version__)
    #pragma DATA_ALIGN (spiTivaDMAscratchBuf、32)
    #Elif defined (_IAR_systems_icc_)
    #pragma DATA_alignment=32
    #Elif defined (_GNU_)
    __attribute__((对齐(32)))
    #endif
    uint32_t spiTivaDMAscratchBuf[EK_TM4C129EXL_SPICOUNT];

    CONST SPITivaDMA_HWAttrs spiTivaDMAHWAttrs[EK_TM4C129EXL_SPICOUNT]={
    {
    baseAddr = SSI2_base、
    .intNum = INT_SSI2、
    .intPriority =(~0)、
    .scratchBufPtr =&spiTivaDMAscratchBuf[0]、
    defaultTxBufValue = 0、
    .rxChannelIndex = UDMA_SEC_CHANGE_UART2RX_12、
    txChannelIndex = UDMA_SEC_CHANGE_UART2TX_13、
    channelMappingFxn = uDMAChannelAssign、
    .rxChannelMappingFxnArg = UDMA_CH12_SSI2RX、
    txChannelMappingFxnArg = UDMA_CH13_SSI2TX
    }、
    {
    baseAddr = SSI3_base、
    .intNum = INT_SSI3、
    .intPriority =(~0)、
    .scratchBufPtr =&spiTivaDMAscratchBuf[1]、
    defaultTxBufValue = 0、
    .rxChannelIndex = UDMA_SEC_CHANGE_TMR2A_14、
    txChannelIndex = UDMA_SEC_CHANGE_TMR2B_15、
    channelMappingFxn = uDMAChannelAssign、
    .rxChannelMappingFxnArg = UDMA_CH14_SSI3RX、
    txChannelMappingFxnArg = UDMA_CH15_SSI3TX
    }
    };

    CONST SPI_Config SPI_CONFIG[]={
    {
    fxnTablePtr =&SPITIvaDMA_fxnTable、
    .object =&spiTivaDMAObjects[0]、
    hwAttrs =&spiTivaDMAHWAttrs[0]
    }、
    {
    fxnTablePtr =&SPITIvaDMA_fxnTable、
    .object =&spiTivaDMAObjects[1]、
    hwAttrs =&spiTivaDMAHWAttrs[1]
    }、
    {NULL、NULL、NULL}
    };

    /*
    *==== EK_TM4C129EXL_initSPI ===
    *
    void EK_TM4C129EXL_initSPI (void)
    {
    /* SSI2 */
    /*
    *注意:TI-RTOS 示例为 SSI2或 I2C7配置引脚 PD0和 PD1。 因此、
    *在中同时使用 I2C 和 SPI 驱动程序时会发生冲突
    *应用程序。 修改此文件中的引脚多路复用设置并解析
    *运行应用程序前发生冲突。
    *
    SysCtlPeripheralEnable (SYSCTL_Periph_SSI2);

    GPIOPinConfigure (GPIO_PD3_SSI2CLK);
    GPIOPinConfigure (GPIO_PD2_SSI2FSS);
    GPIOPinConfigure (GPIO_PD1_SSI2XDAT0);
    GPIOPinConfigure (GPIO_PD0_SSI2XDAT1);

    GPIOPinTypeSSI (GPIO_PORTD_base、GPIO_PIN_0 | GPIO_PIN_1 |
    GPIO_PIN_2 | GPIO_PIN_3);

    /* SSI3 *///随新方案而更改
    SysCtlPeripheralEnable (SYSCTL_Periph_SSI3);

    GPIOPinConfigure (GPIO_PF3_SSI3CLK);
    //GPIOPinConfigure (GPIO_PF2_SSI3FSS);
    GPIOPinConfigure (GPIO_PQ2_SSI3XDAT0);
    GPIOPinConfigure (GPIO_PQ3_SSI3XDAT1);

    GPIOPinTypeSSI (GPIO_PORTQ_BASE、GPIO_PIN_2 | GPIO_PIN_3);
    GPIOPinTypeSSI (GPIO_PORTF_BASE、GPIO_PIN_3);
    //GPIOPinTypeSSI (GPIO_PORTF_BASE、GPIO_PIN_3 | GPIO_PIN_2);
    #if 0
    GPIOPinConfigure (GPIO_PQ0_SSI3CLK);
    GPIOPinConfigure (GPIO_PQ1_SSI3FSS);
    GPIOPinConfigure (GPIO_PQ2_SSI3XDAT0);
    GPIOPinConfigure (GPIO_PQ3_SSI3XDAT1);

    GPIOPinTypeSSI (GPIO_PORTQ_BASE、GPIO_PIN_0 | GPIO_PIN_1 |
    GPIO_PIN_2 | GPIO_PIN_3);
    #endif
    EK_TM4C129EXL_initDMA ();
    spi_init();
    }

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

    谢谢。 您能否确认 Board_SPI3定义为1。

    您在实际线路上看到了什么? 是否有任何内容被发送出去?

    Todd

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

    您好 Todd、

    Board_SPI3为1。 SPI 传输正在发生、但情况不寻常。 我将默认数据大小设置为8。 为了传输16位数据、我将其拆分为2。 但是第二个字节的 MSB 不会写入寄存器、也就是说、我将第二个字节写入0xBB、当我读回时、它将读取为0x3B。

    au8_buf[0]= register_write |((u8_regAddress & 0x3F)<< logical_shif_one)|(((U16_regData & MASK_0x100)>> logical_shif_eight);
    au8_buf[1]=(U16_regData 和 MASK_0xFF);

    /*初始化 SPI 事务结构*/
    masterTransaction.count = 2;
    masterTransaction.txBuf =(ptr) au8_buf;

    masterTransaction.rxBuf =(ptr)空;

    /*Chip select low to enable SPI transfer*/
    GPIO_write (u8_adcc、Board_GPIO_off);
    /*启动 SPI 传输*/
    U8_ret = SPI_transfer (masterSpi、masterTransaction);
    /*芯片选择高电平禁用 SPI 传输*/
    GPIO_write (u8_adcc、Board_GPIO_on);

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

    很抱歉耽误你的时间。

    您在导线上看到了什么(例如逻辑分析仪)?

    Todd

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

    您好!

    连接的 SPI 器件在时钟的上升沿提供输出数据。 通过探测到示波器的引脚可以很明显地看出、控制器必须在下降沿读取数据。但可以看到控制器在前一个时钟的下降沿读取数据。 因此、值发生移位。

    此致

    Jamshi

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

    Jamshi、

    可以使用您自己的 GPIO 芯片选择、而不使用 FSS。 您是否曾尝试在芯片选择有效和 SPI_TRANSLT()调用之间添加延迟,以确保从器件已为事务做好准备?

    Jas

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

    [引用 user="jamshi pj"]SPI 器件在时钟的上升沿提供输出数据。 通过探测到示波器的引脚可以很明显地看出、控制器必须在下降沿读取数据。但可以看到控制器在前一个时钟的下降沿读取数据。 因此会发生值偏移。 AD7616 SPI 时序为:

    这意味着要使用的 TM4C SPI 配置为:

    要设置 TM4C 模式、需要设置所需的 SPI 参数、并将其作为第二个参数传递给 SPI_OPEN 函数。 例如、尝试:

    SPI_Params slaveSpiParams;
    en_transferStat_t en_transferOk;
    SPI_Params_init (&slaveSpiParams);
    slaveSpiParams.mode = SPI_MASTER;
    slaveSpiParams.frameFormat = SPI_POL1_PHA1; /* SPI 模式极性1相位1 *//
    
    //*初始化 SPI 句柄作为 ADC*/
    masterAdc1的默认主控器= SPI_open (Board_SPI3、&slaveSpiParams); 

    原始代码将 NULL 作为第二个参数传递给 SPI_OPEN (),这意味着使用默认 SPI 参数,默认 的帧格式为 SPI_POL0_PHA0 /* SPI 模式极性0相位*/

    您可能还需要将 slaveSpiParams.bitrate 设置为以 Hz 为单位的所需位速率。 默认值为1MHz。

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

    您好!

    我更改为

    masterAdc1 = SPI_open (Board_SPI3、&slaveSpiParams);

    使用 SPI 模式极性0相位0、I WRITE 寄存器和 SPI 模式极性0相位1读取转换结果。 我无法以相同的极性执行所有操作。

    
    

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

    Jamshi、

    我不确定您在这里用不同极性写入和读取寄存器意味着什么、但一旦打开 SPI 实例、您就无法更改极性。 我相信您正在寻找的极性和相位设置是 SPO=1和 SPH=0。

    Jas