新手入门
- 积分
- 18
- 金钱
- 18
- 注册时间
- 2016-9-27
- 在线时间
- 1 小时
|
1金钱
本人最近做一个项目,利用STM32的SPI串口驱动24位DA芯片,芯片型号为AD5362,最近遇到一些问题,希望大牛们能够给与解答;程序在下面:SPI初始化
void SPI1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );//PORTBê±Öóê1Äü
RCC_APB2PeriphClockCmd( RCC_APB2Periph_SPI1, ENABLE );//SPI2ê±Öóê1Äü
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //PB5/6/7¸′óÃíÆíìêä3ö
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);//3õê¼»ˉGPIOB
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //PB5/6/7¸′óÃíÆíìêä3ö
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);//3õê¼»ˉGPIOB
GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7); //PB5/6/7éÏà-
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //éèÖÃSPIμ¥Ïò»òÕßË«ÏòμÄêy¾YÄ£ê½:SPIéèÖÃÎaË«ÏßË«Ïòè«Ë«1¤
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //éèÖÃSPI1¤×÷Ä£ê½:éèÖÃÎaÖ÷SPI
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //éèÖÃSPIμÄêy¾Y′óD¡:SPI·¢Ëí½óêÕ8λ֡½á11
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //′®DDí¬2½ê±ÖóμÄ¿ÕÏD×′ì¬Îa¸ßμçÆ½
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //′®DDí¬2½ê±ÖóμÄμú¶t¸öìø±äÑØ£¨éÏéy»òϽ죩êy¾Y±»2éÑù
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSSDÅoÅóéó2¼t£¨NSS1ü½Å£©»1êÇèí¼t£¨ê1óÃSSI룩1üàí:Äú2¿NSSDÅoÅóDSSIλ¿ØÖÆ
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8; //¶¨òå2¨ìØÂêÔ¤·ÖÆμμÄÖμ:2¨ìØÂêÔ¤·ÖÆμÖμÎa256
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //Ö¸¶¨êy¾Y′«êä′óMSBλ»1êÇLSBλ¿aê¼:êy¾Y′«êä′óMSBλ¿aê¼
SPI_InitStructure.SPI_CRCPolynomial = 7; //CRCÖμ¼ÆËãμĶàÏîê½
SPI_Init(SPI1, &SPI_InitStructure); //¸ù¾YSPI_InitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèSPIx¼Ä′æÆ÷
SPI_Cmd(SPI1, ENABLE); //ê1ÄüSPIíaéè
SPI_I2S_ITConfig(SPI1,SPI_I2S_IT_TXE,ENABLE);
SPI1_ReadWriteByte(0xff);//Æô¶ˉ′«êä
}
SPI写端口数据:
u8 SPI1_WriteByte(u8 *TxBuffer,u8 TxLength)
{
u8 retry=0;
u8 tempD;
while (TxLength--)
{
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) //¼ì2éÖ¸¶¨μÄSPI±ê־λéèÖÃóë·ñ:·¢Ëí»o′æ¿Õ±ê־λ
{
retry++;
if (retry>600)return 0;
}
tempD=*TxBuffer;
SPI1->DR = tempD;
// SPI_I2S_SendData(SPI1,tempD);
TxBuffer++;
retry=0;
}
}
写AD5362控制寄存器:
u8 AD5362_Control_Register_Configure(u8 mode,u8 addr,u16 data)
{
u8 Cmd[4];
u8 *temp;
int i;
Cmd[0]=(mode<<6)|addr;
Cmd[1]=(data>>8)&0xFF;
Cmd[2]=data&0xFF;
temp=&Cmd[0]; //êy×éê×μØÖ·¸3¸øÖ¸Õëtemp
AD5362_BUSY=1;
AD5362_LDAC=1;
AD5362_SYNC=1; //2úéúò»¸öÆô¶ˉÂö3å
delay_us(2);
AD5362_SYNC=0;
delay_us(2);
SPI1_WriteByte(temp,4); //D′ÅäÖÃDÅÏ¢
delay_us(5);
AD5362_SYNC=1; //½áêøÂö3å
delay_us(2);
AD5362_SYNC=0;
}
在写控制寄存器时,采用单步调试,可是每次看SPI->DR里面时,发现Cmd[0]总是不能写入,不知道怎么回事?请大牛们帮着解答一下
|
|