Estoy intentando configurar el chip LIS3DH a través de la interfaz SPI. Aquí está mi código:
void init(void)
{
SPI_InitTypeDef SPI_InitStructure;
// SPI configuration
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8; //4;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI_INT, &SPI_InitStructure);
// Enable SPI
SPI_Cmd(SPI_INT, ENABLE);
}
void set_up(void)
{
uint16_t buf = 0, msg = 0;
msg = READ + DEVICE_TYPE_REG;
//msg = 0x80 + 0x0F;
LIS3DHTR_CHIP_SELECT();
while (1) {
while (SPI_I2S_GetFlagStatus(SPI_INT, SPI_I2S_FLAG_BSY) == SET);
SPI_I2S_SendData(SPI_INT, msg);
while (SPI_I2S_GetFlagStatus(SPI_INT, SPI_I2S_FLAG_BSY) == SET);
if (SPI_I2S_GetFlagStatus(SPI_INT, SPI_I2S_FLAG_RXNE) == SET) {
buf = SPI_I2S_ReceiveData(SPI_INT);
if (buf == 51)
break;
}
}
LIS3DHTR_CHIP_DESELECT();
}
Problema: el registro lis3dh con la dirección 0x0F
se mantiene constante 51 (tipo de dispositivo de algo). cuando envío una solicitud para leer este registro (dirección Reg más bit MSB establecido) a través de la interfaz SPI STM32F107 SPI RX Register me da 0xFF
al principio. Y solo en la segunda iteración del ciclo ( while(1)
) me sale verdadero 51. Este problema aparece en cada solicitud de mi chip a lis3dh.
¿Es normal o me he perdido algo?