RT,求大大门帮帮忙,网上也没有相关可以参考的东西,使用SPI3,对应PB3,4,5;cs信号使PG6
mc33879是一个IO芯片,时序我看了,的确是空闲SCK低,第二个SCKt跳边沿传输数据。
要求是16位的命令 ,我就设置SPI3为16位的,
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOG,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_ResetBits(GPIOB,GPIO_Pin_3);
GPIO_SetBits(GPIOB,GPIO_Pin_4|GPIO_Pin_5);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
GPIO_InitStructure.GPIO_Pin=GPIO_Mode_Out_PP;
GPIO_Init(GPIOG,&GPIO_InitStructure);
GPIO_SetBits(GPIOG,GPIO_Pin_6); //cs
SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode=SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize=SPI_DataSize_16b;
SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA=SPI_CPHA_2Edge;
SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_16;
SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial=7;
SPI_Init(SPI3,&SPI_InitStructure);
SPI_Cmd(SPI3,ENABLE);
MC33879_SPI3_WriteRead2Bytes(0xffff);
}
u16 MC33879_SPI3_WriteRead2Bytes(u16 TxData)
{
u8 retry=0;
while(SPI_I2S_GetFlagStatus(SPI3,SPI_I2S_FLAG_TXE)==RESET)
{
retry++;
if(retry>200)
{printf("SEND failed\r\n"); return 0;}
}
SPI_I2S_SendData(SPI3,TxData);
retry=0;
while(SPI_I2S_GetFlagStatus(SPI3,SPI_I2S_FLAG_RXNE)==RESET)
{
retry++;
if(retry>200)
{printf("Receive failed\r\n"); return 0;}
}
return SPI_I2S_ReceiveData(SPI3);
}
void MC33879_WriteRead2Bytes(u16 TxData)
{
GPIO_ResetBits(GPIOG,GPIO_Pin_6);
MC33879_STATUS=MC33879_SPI3_WriteRead2Bytes(TxData);
delay_ms(5);
//printf("Getstatus %d\r\n",MC33879_STATUS);
//MC33879_CS_High;
GPIO_SetBits(GPIOG,GPIO_Pin_6);
}
void MC33879_Init(void)
{
MC33879_STATUS=0X00;
printf("Init MC33879_STATUS to %d\r\n",MC33879_STATUS);
MC33879_SPI3_Init();
MC33879_WriteRead2Bytes(0x0002);
printf("First cmd Return %d\r\n",MC33879_STATUS);
MC33879_WriteRead2Bytes(0x0002);
printf("Second cmd Return %d\r\n",MC33879_STATUS);
}
可是串口输出的数据一直是65534阿,MC33879的数据手册上说,发送一个16位命令就会返回一个16位状态值,初始化要发两次,第二次的作为正式命令接受,
返回的16位状态值,高8位肯定是0阿。
不知道怎么搞了呢,
|