本帖最后由 xuqj4490 于 2011-2-16 14:01 编辑
前面用STM32的I2C来驱动加速度芯片LIS33DE,成功了,但感觉STM32的I2C比较麻烦,而LIS33DE(ST公司的)支持I2C和SPI两种总线,所以现在想用SPI来做,结果搞了很久LIS33DE一直没有输出。
问题:用示波器观察,CS和SCK都正常,STM32的MOSI脚有数据送出,但MISO一直没有数据。不知道是什么原因,让大家帮忙看看。对于我自己写的那几个读写程序比较怀疑,望大家指点下。
不多说了,上程序和图。
1 我使用的是STM32的SPI2 接LIS33DE。下面是SPI2的配置
void SPI_Configuration(void)
{
SPI_InitTypeDef SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
//启动SPI时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
//////下面是SPI相关GPIO初始化//////
//SPI2模块对应的SCK、MISO、MOSI为AF引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//PB12 pin: SPI2_CS
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//////SPI模块配置//////
//一开始SD初始化阶段,SPI时钟频率必须<400K
SPI_Cmd(SPI2, DISABLE); //必须先禁能,才能改变MODE
SPI2_CS_DISABLE();
/* SPI2 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_1Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI2, &SPI_InitStructure);
/* Enable SPI2 */
SPI_Cmd(SPI2, ENABLE);
}
2 LIS33DE的SPI接口介绍
SPI读写时序
读程序:
u8 Lis33de_SPI_RD(u8 add)
{
u8 tmp;
SPI2_CS_ENABLE();
SPI_ReadWriteByte(add | 0x80);
tmp=SPI_ReadWriteByte(0xff);
SPI2_CS_DISABLE();
return tmp;
}
写程序:
void Lis33de_SPI_WR(u8 add,u8 wrdata)
{
SPI2_CS_ENABLE();
SPI_ReadWriteByte(add);
SPI_ReadWriteByte(wrdata);
SPI2_CS_DISABLE();
}
SPI读写子函数:
u8 SPI_ReadWriteByte(u8 TxData)
{
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI2, TxData);
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
return SPI_I2S_ReceiveData(SPI2);
}
LIS33DE的初始化
void SPI_Lis33de_Init()
{
Lis33de_SPI_WR(0x20,0x47);
Lis33de_SPI_WR(0x21,0x00);
Lis33de_SPI_WR(0x22,0x00);
}
程序的主结构:
int main(void)
{
u8 DX,DY,DZ;
RCC_Configuration();
GPIO_Configuration();
NVIC_Configuration();
USART1_Configuration();
SPI_Configuration() ;
SPI_Lis33de_Init();
while(1)
{
DX = Lis33de_RD(0x29);
DY = Lis33de_RD(0x2B);
DZ = Lis33de_RD(0x2D);
printf("$\tg\t%d\t%d\t%d",DX,DY,DZ);
}
} |