芯片是F070的 用的不多 前后的SPI用HAL库、标准库和软件模拟都试了,没能成功驱动 表现就是SPI读不出数据,也没发现哪出问题,因此求助。
贴上代码
/***********************************SPI部分*************************************/
extern SPI_HandleTypeDef hspi1;
//SPI初始化
void SPI_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_GPIOA_CLK_ENABLE();
HAL_GPIO_WritePin(GPIOA, SPI_CLK_PIN|SPI_MISO_PIN|SPI_MOSI_PIN, GPIO_PIN_SET);
#if USE_HW_SPI
// HAL_SPI_MspInit(&hspi1);
__HAL_RCC_SPI1_CLK_ENABLE();
GPIO_InitStruct.Alternate = GPIO_AF0_SPI1;
GPIO_InitStruct.Pin = SPI_CLK_PIN|SPI_MISO_PIN|SPI_MOSI_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* SPI1 parameter configuration*/
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 7;
hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
__HAL_SPI_ENABLE(&hspi1);
#else
GPIO_InitStruct.Pin = SPI_CLK_PIN|SPI_MOSI_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = SPI_MISO_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
#endif
}
//SPI发送一个字节
u8 SPI_ReadWriteByte(u8 dat)
{
#if USE_HW_SPI
uint8_t rev_dat;
HAL_SPI_TransmitReceive(&hspi1,&dat,&rev_dat,1,1000);
return rev_dat;
#else
for(u8 i=0; i<8; i++)
{
if(dat&0x80)
SPI_MOSI_H();
else
SPI_MOSI_L();
// Delay_us(1);
dat <<= 1;
SPI_CLK_H(); //第一个时钟
// Delay_us(1);
if(SPI_MISO_READ())
dat |= 0x01;
else
;;
SPI_CLK_L();//第二个时钟
}
return dat;
#endif
}
/***********************************2401 检测部分******************************/
uint64_t temp=0,r_temp=0,w_temp=0x123456789AULL;
u8 err_sta = ERROR;
NRF24L01_CE_L();
NRF24L01_ReadBuf(READ_REG_CMD + TX_ADDR,(u8*)&temp,5); //读出数据
NRF24L01_WriteBuf(WRITE_REG_CMD + TX_ADDR,(u8*)&w_temp,5); //写入新数据
NRF24L01_ReadBuf(READ_REG_CMD + TX_ADDR,(u8*)&r_temp,5); //读出数据
if(r_temp == w_temp)
{
NRF24L01_WriteBuf(WRITE_REG_CMD + TX_ADDR,(u8*)&temp,5); //还原数据
err_sta = SUCCESS ;
}
else
err_sta = ERROR ; //MCU与NRF不正常连接
NRF24L01_CE_H();
return err_sta;
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
贴上SPI部分代码
void SPI_Configration(void)
{
GPIO_InitTypeDef GPIO_InitStructureure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
//CS
GPIO_InitStructureure.GPIO_Pin = SPI_CS_PIN;
GPIO_InitStructureure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructureure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructureure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructureure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(SPI_CS_PORT,&GPIO_InitStructureure);
//SCK
GPIO_InitStructureure.GPIO_Pin = SPI_SCK_PIN;
GPIO_InitStructureure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructureure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructureure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructureure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(SPI_SCK_PORT,&GPIO_InitStructureure);
//MISO
GPIO_InitStructureure.GPIO_Pin = SPI_MISO_PIN;
GPIO_InitStructureure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructureure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructureure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructureure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(SPI_MISO_PORT,&GPIO_InitStructureure);
//MOSI
GPIO_InitStructureure.GPIO_Pin = SPI_MOSI_PIN;
GPIO_InitStructureure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructureure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructureure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructureure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(SPI_MOSI_PORT,&GPIO_InitStructureure);
SPI_CS_HIGH;
SPI_SCK_LOW;
}
u8 SPI_ReadWriteByte(u8 dat)
{
u8 i;
SPI_SCK_LOW; //先将时钟线拉低
for(i=0;i<8;i++)
{
if((dat&0x80)==0x80) //从高位发送
{
SPI_MOSI_HIGH;
}
else
{
SPI_MOSI_LOW;
}
SPI_SCK_HIGH; //将时钟线拉高,在时钟上升沿,数据发送到从设备
dat<<=1;
if(SPI_MISO_READ) //读取从设备发射的数据
{
dat|=0x01;
}
SPI_SCK_LOW; //在下降沿数据被读取到主机
}
return dat; //返回读取到的数据
}
一周热门 更多>