主题中讨论的其他器件: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();
}
有什么建议吗?
提前感谢。