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.

[参考译文] TM4C1294NCPDT:LIS3DHTR 的 SPI 通信问题

Guru**** 2601915 points
Other Parts Discussed in Thread: CC1101

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1130394/tm4c1294ncpdt-spi-communication-issues-with-lis3dhtr

器件型号:TM4C1294NCPDT
主题中讨论的其他器件:CC1101

我尝试通过 SPI A TM4C1294与 LIS3DHTR 进行通信、但我遇到了一些问题。

我使用的是定制板、我已将加速计连接到 SSI0端口、我还将 CC1101器件连接到该端口。

这是我要使用的 SPI 初始化代码:

void acc_config (uint32_t clock、int16_t * acc1、int16_t * acc2、int16_t * acc3、int16_t * inc1、int16_t * inc2、int16_t * inc3)

sysclock=时钟;
ACC1=ACC1;
ACC2=ACC2;
ACC3=ACC3;
INC1=INC1;
INC2=INC2;
INC3=INC3;

SysCtlPeripheralEnable (SYSCTL_Periph_SSI0);

while (!SysCtlPeripheralReady (SYSCTL_Periph_SSI0))


SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);

GPIOPinTypeGPIOOutput (GPIO_Porta_base、GPIO_PIN_3);
GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_3、GPIO_PIN_3);

/* IO 端口配置为 SSI 功能*/
GPIOPinConfigure (GPIO_PA2_SSI0CLK);
GPIOPinConfigure (GPIO_PA3_SSI0FSS);
GPIOPinConfigure (GPIO_PA4_SSI0XDAT0);
GPIOPinConfigure (GPIO_PA5_SSI0XDAT1);

/*设置 SSI IO 端口的模式*/
GPIOPinTypeSSI (GPIO_Porta_base、GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5);

SSIDisable (SSI0_BASE);

/* SSI 配置模式3 (极性= 1相= 1)主控模式速度 ​​1MHz 数据长度8位*/
//SSIConfigSetExpClk (SSI0_BASE、sysclock、SSI_FRF_MOTO_MOTO_1、SSI_MODE_MASTER、100000、 16);
SSIConfigSetExpClk (SSI0_BASE、sysclock、SSI_FRF_MOTO_MOTO_MODE_2、SSI_MODE_MASTER、100000、 8);
/*启用 SSI0 */
SSIEnable (SSI0_BASE);
uint32_t pui32DataRx;
while (SSIDataGetNonBlocking (SSI0_BASE、&pui32DataRx))


lis3dh_configure();

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

其中时钟为:

G_ui32SysClock = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

这些是我正在使用的读取/写入函数:

void lis3dh_read_xyz (int16_t *x、int16_t *y、int16_t *z)

//uint8_t ansbuf[2];

lis3dh_read_reg (0x20、reg1);
lis3dh_read_reg (0x23、reg4);

lis3dh_read_reg (LIS3DH_WH_AM_I、&id);
lis3dh_read_reg (LIS3DH_OUT_X_L、&x_l);
lis3dh_read_reg (LIS3DH_OUT_X_H、&x_h);

lis3dh_read_reg (LIS3DH_OUT_Y_L、&y_l);
lis3dh_read_reg (LIS3DH_OUT_Y_H、&y_h);

lis3dh_read_reg (LIS3DH_OUT_Z_L、&z_l);
lis3dh_read_reg (LIS3DH_OUT_Z_H、&z_h);

*x=(x_h <<8 | x_l);// 12位数据
*y=(y_h <<8 | y_l);// 12位数据
*z=(z_h <8 | z_l);// 12位数据

void lis3dh_read_reg (uint8_t addr、uint8_t *数据读取)

uint8_t 虚拟;
uint8_t 操作;
uint8_t 字节;
uint32_t ui32DummyData;
uint32_t 地址;
操作= LIS3DH_SINGLE_READ;

lis3dh_csStart();


address=(operation | addr);
// TX
while (SSIBusy (SSI0_BASE));
SSIDataPut (SSI0_BASE、(地址));//将数据元素放入 SSI 发送 FIFO 中

//等待完成
while (SSIBusy (SSI0_BASE));

SSIDataGet (SSI0_BASE、&dummy);

SSIDataPut (SSI0_BASE、(0x00));//将数据元素放入 SSI 发送 FIFO 中
//等待完成
while (SSIBusy (SSI0_BASE));
SSIDataGet (SSI0_BASE、byte);

readed= byte;
*DataRad=readed;
lis3dh_csStop();

void lis3dh_mult_read_reg (uint8_t addr、uint8_t *数据读取、uint8_t len)

uint8_t 操作;
uint8_t 地址;
uint8_t 字节;
uint8_t 虚拟;
if (len > 1){
操作= LIS3DH_MULTIPLE_READ;
}否则{
操作= LIS3DH_SINGLE_READ;

lis3dh_csStart();
//SysCtlDelay (5);
地址=操作|addr;

while (SSIBusy (SSI0_BASE));
SSIDataPut (SSI0_BASE、地址);//将数据元素放入 SSI 发送 FIFO 中

//等待完成
while (SSIBusy (SSI0_BASE));
SSIDataGet (SSI0_BASE、&dummy);

uint8_t i;
for (i=0;<len; i++)

// TX 虚拟0
SSIDataPut (SSI0_BASE、(0x00));

//等待完成
while (SSIBusy (SSI0_BASE));
// RX
SSIDataGet (SSI0_BASE、byte);

DataRad[i]=字节;

//SysCtlDelay (5);
lis3dh_csStop();

void lis3dh_write_reg (uint8_t addr、uint8_t DataWrite)

uint8_t 操作= LIS3DH_SINGLE_WRITE;
uint32_t ui32DummyData;
uint32_t 地址;
uint8_t 虚拟;

lis3dh_csStart();
//SysCtlDelay (5);
address=(operation | addr);
// TX OP + ADDR
while (SSIBusy (SSI0_BASE));
SSIDataPut (SSI0_BASE、地址);//将数据元素放入 SSI 发送 FIFO 中
//等待完成
while (SSIBusy (SSI0_BASE));
SSIDataGet (SSI0_BASE、&dummy);

SSIDataPut (SSI0_BASE、DataWrite);//将数据元素放入 SSI 发送 FIFO 中

//等待完成
while (SSIBusy (SSI0_BASE));
SSIDataGet (SSI0_BASE、&dummy);

//SysCtlDelay (5);
lis3dh_csStop();

有什么建议吗?

提前感谢。

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

    Ander、您好!

    通过查看数据表和查看 SPI 规格、可以看出该器件使用 SPI 模式3。 您有显示模式1和模式2均已尝试的代码、但 您是否已尝试 SSI_FRF_MOTO_MOTO_MODE_3?

    我建议的另一件事是在线路上获得一个 LSA (或如果需要、一个示波器)、以查看 MCU 输出的内容以及目标器件的任何潜在响应。

    此致、

    Ralph Jacobi

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

    感谢 De Answer Ralph!

    我尝试过所有模式、但查看数据表("。 SDI 和 SDO 分别是串行端口数据输入和输出。 这些线在 SPC 的下降边沿被驱动并且应该在 SPC 的上升边沿被捕捉。") 并阅读 此 SPI 简介 ("图5。 SPI 模式2、CPOL = 1、CPHA = 0:CLK 空闲状态=高电平、在上升沿采样数据并在下降沿移位。")、我已经解释了模式2是正确的模式。

    总之、我在运行 LIS3DHTR 的情况下进行 SPI 通信。 我已执行以下步骤:

    1. 我已选择 SSI_FRF_MOTO_MODE_0 (我将尝试其他模式)
    2. LISD3HTR 和 CC1101 IC 共享 SPI 总线。 我将 CC1101设置为高电平以避免干扰。
    3.  我手动控制 LIS3DHTR CS。 它由 SSI 外设管理、在地址字节和虚拟字节之间拉高。 我认为这是对读取操作的重新处理。

    现在、我将尝试与 CC1101进行通信。