任务需求:在一个CS周期内需要32个SPI 的sclk,但是根据spi的配置程序,最多实现16个SCLK。 请问如何实现在一个CS周期内产生32个sclk???
程序代码:
//SPI初始化
SPI_InitStructure.SPI_Direc
tion = SPI_Direction_2Lines_RxOnly; //双线只接受
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //主模式
SPI3->CR1|=1<<10; //只接受
SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b; //设置SPI的数据大小
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_32;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(AD_SPI, &SPI_InitStructure);
主程序:
while (1)
{
GPIO_ResetBits(AD_CS_GPIO_PORT,AD_CS_PIN); //CS=0
Delay(5);
SPI_Cmd(AD_SPI, ENABLE); //SPI使能
data= SPIx_ReadWriteByte(); // 返回SPI_DR数据
SPI_Cmd(AD_SPI, DISABLE); //SPI失能
Delay(120); //增加延时
GPIO_SetBits(AD_CS_GPIO_PORT,AD_CS_PIN); //CS=1
Delay(5);
}
波形图:
只是配置成只发送的话,接收数据线上的数据被忽略;要接收的话,也得发送个数,只是这个数并不关心罢了。
所以再尝试下,DMA 发送数据的方式,可以避免状态位的查询,同时用另一个DMA接收,希望能成功。谢谢您!!!
(这就是那个写和收的SPI数据传输的函数)
u16 SPIx_ReadWriteByte2 (u16 byte) //SPI双工,收发数据
{
SPITimeout = SPIT_FLAG_TIMEOUT;
/* 等待发送缓冲区为空,TXE事件 */
while (SPI_I2S_GetFlagStatus(AD_SPI, SPI_I2S_FLAG_TXE) == RESET)
{
if((SPITimeout--) == 0) return 0;
}
/*写入数据寄存器,把要写的数据写入发送缓冲区 */
SPI_I2S_SendData(AD_SPI, byte);
/* 等待接收缓冲区非空,RXNE事件*/
SPITimeout = SPIT_FLAG_TIMEOUT;
while (SPI_I2S_GetFlagStatus(AD_SPI, SPI_I2S_FLAG_RXNE) == RESET)
{
if((SPITimeout--) == 0) return 0; //等待超时
}
return SPI_I2S_ReceiveData(AD_SPI); //返回数据
}
一周热门 更多>