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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/666351/ccs-tm4c129encpdt-spi-program-for-multiple-slave

器件型号:TM4C129ENCPDT
主题中讨论的其他器件:AMC7820

工具/软件:Code Composer Studio

您好!

在我的设计中、我必须在 SPI2中配置2个从机模块。

我使用的从机模块是 TI- AMC7820。

首先、我尝试配置单个 SPI 模块。

我使用的引脚是 PD0、PD1和 PD3。 从器件1的片选为 PK3。

我已经修改了将0x2345写入寄存器并读回它的代码。 但我读回的是 NULL

init、read 和 write 函数如下所示。

void SSI2Init (void)//SPI 2初始化
{

//
必须启用 SSI2外设才能使用。
//
SysCtlPeripheralEnable (SYSCTL_Periph_SSI2);


SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);


SysCtlPeripheralEnable (SYSCTL_Periph_GPIOK);//为


端口 D0、D1和 D3上的 SSI0函数配置引脚多路复用。
//
GPIOPinConfigure (GPIO_PD0_SSI2XDAT1);
GPIOPinConfigure (GPIO_PD1_SSI2XDAT0);
GPIOPinConfigure (GPIO_PD3_SSI2CLK);



// GPIOPinConfigure (GPIO_PA3_SSI0FSS);//这不是因为 CS 是 GPIO_PIN1引脚



输出引脚/ GPIO_PIN1引脚输出引脚1引脚、GPIO_PIN1引脚输出引脚1引脚

GPIOPinWrite (GPIO_PORTK_base、GPIO_PIN_3、GPIO_PIN_3);//将其设为高电平、因为它为低电平有效

//
//配置 SSI 引脚的 GPIO 设置。
//

GPIOPinTypeSSI (GPIO_PORTD_base、GPIO_PIN_3 | GPIO_PIN_1 | GPIO_PIN_0);
//
为 SPI 主控模式配置和启用 SSI 端口。 使用 SSI2、
//

SSIConfigSetExpClk (SSI2_base、g_ui32SysClock、SSI_FRF_TI、
SSI_MODE_MASTER、 1000000、8);


//
//启用 SSI2模块。
//
SSIEnable (SSI2_base);

//
从 SSI 端口读取任何残留数据。
//
while (SSIDataGetNonBlocking (SSI2_base、&pui32DataRx[0])
}{
}



void SPI2Read (void)
{

pui32DataTx[0]= 0x82;//从寄存

器 pui32DataTx[1]= 0x40读取;

GPIOPinWrite (GPIO_PORTK_= 0x32



);//使用 i32+引脚索引</ u32+、uCS 函数;/u32+、u32+、u32+、u32+、u32eUS+、u32e+、u32e+、i32eUS+、i240/ u32u240/ u240/ u240/ u240/ u240u240u240u240u240u240u240u240u 此函数
//将等待发送 FIFO 中有空间后再返回。
//这使您可以确保发送的所有数据都将其放入
//发送 FIFO 中。
//
SSIDataPut (SSI2_base、pui32DataTx[ui32Index]);
}

//
//等待 SSI0完成传输发送 FIFO 中的所有数据。
//
while (SSIBusy (SSI2_base)
){
}



//接收2个字节的数据。
//
for (ui32Index = 0;ui32Index < 2;ui32Index++)
{


//
//使用“阻塞”GET 函数接收数据。 此函数
//将等待接收 FIFO 中有数据后再返回。
//
SSIDataGet (SPIBase、&pui32DataRx[ui32Index]);

//由于我们使用的是8位数据,因此屏蔽 MSB。
//
pui32DataRx[ui32Index]&= 0x00FF;


}
GPIOPinWrite (GPIO_PORTK_base、GPIO_PIN_3、GPIO_PIN_3);//将 CS 重置为高

电平}

void SPIwrite (void)
{

pui32DataTx[0]= 0x02;
pu32DataTx[1]= 0x40=PIPTX=0x40_PIPTH




;pitTx23_GPIOPTH GPIO_PIN_3、0)// CS 低电平;AMC 期望低电平有效控制信号
(ui32Index = 0;ui32Index < 4;ui32Index++)
{


//
//使用“阻塞”Put 函数发送数据。 此函数
//将等待发送 FIFO 中有空间后再返回。
//这使您可以确保发送的所有数据都将其放入
//发送 FIFO 中。
//
SSIDataPut (SSI2_base、pui32DataTx[ui32Index]);


}

//
//等待 SSI0完成传输发送 FIFO 中的所有数据。
//
while (SSIBusy (SSI2_base)
{
}
GPIOPinWrite (GPIO_PORTK_base、GPIO_PIN_3、GPIO_PIN_3);//将 CS 重置为高

电平} 

请帮帮我。

提前感谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我想问题是您没有提供 SPICLK 来读取数据。 在以下主题中、我们对 SPI 的全双工特性进行了基本讨论: e2e.ti.com/.../665776

    如果我正确理解 AMC7820、您会发送一条16位命令、然后发送16位虚拟数据以读取响应。 您已将 SSI2配置为在每次调用时将一个字节传输到 SSIDataPut、并调用它两次以发送命令。 但 SSIDataGet 不会生成任何 SSICLK 边沿。 它只读取在主器件最后一次 SSIDataPut 调用期间捕获的 FIFO 中的数据。

    发送两个字节的命令后、发送两个虚拟字节来读取响应。 然后从 FIFO 读取四个字节、丢弃前两个字节。 结果位于后两个字节中。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Bob:

    感谢您的快速响应。

    "但 SSIDataGet 不会生成任何 SSICLK 边沿。 它只读取在主器件最后一次 SSIDataPut 调用期间捕获的 FIFO 中的数据。 "

    我理解这一点。 下面给出的函数是否会生成时钟。 这是在初始化期间配置的。

    SSIConfigSetExpClk (SSI2_base、g_ui32SysClock、SSI_FRF_MOTO_MOTO_MODE_1、
    SSI_MODE_MASTER、1000000、8); 

    我找不到用于生成时钟的函数。

    我们修改了代码,将模式更改为 SSI_FRF_MOTO_MODE_1;添加了虚拟发送。 但我们仍然收到 Null 值。

    此致、

    Neethu

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

    尊敬的 Bob:

    问题已解决。

    我们 只在每个 SSIDataPut ()和 SSIDataGet ()之后添加了两行。

    SysCtlDelay (SysCtlClockGet ()/100);
    
    while (SSIBusy (SSI0_BASE)); 

    现在、一切都正常。

    非常感谢。

    此致、

    Neethu

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

    [引用 user="Neethu G Prem10"]我找不到用于生成时钟的函数。

    SSIDataPut ()函数-最肯定的是-生成 SPI 时钟。    正如供应商 Bob 所说的那样- SPI 以全双工模式运行-因此 SSIDataPut ()输出 SPI 时钟和 SPI 数据-它还能够通过 MISO 引脚"接收数据"。    

    您似乎缺少的关键“诀窍”-您必须在 “SSIDataPut ()” 后面加上 “SSIDataGet ()!”     然后、仅在那时-  通过(之前的)"SSIPUT"接收的数据是否 可供您使用...

    [编辑] 如果我可以"直视"、我的手枪更近-我会"自行射击!"    我们的帖子刚刚交叉-很高兴您成功-许多人成为 SPI "异常"性质的受害者...

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

    您好!

    感谢您的宝贵答复。

    正如 Bob 说的、我们修改了完整 dupex 通信模式的代码、但它仍然不起作用。

    今天、我们添加了延迟(Bob 提到过)以及全双工模式。 现在工作正常。:)

    此致、

    Neethu