用STM32在做一个小设计时;把SPI全用光了,然后就用了USART的同步模式;
现在问题是这样,主机可以发送数据,从机可以反应并且在总线上发出数据。但是STM32RXNE始终为0 接收不到数据;有搞过的可以分析一下什么问题啊?
谢谢!
付调试波形
SCK 与 MOSI 主机发送命令0xff 与发送0X10;
0x10细节;
SCK 与 MISO 主机返回状态 与我预先要得到的0x83
0x83 说明从机肯定有用 工作了;
附程序
void WIRELESS_SPI_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* 定义USART初始化结构体 USART_InitStructure */
USART_InitTypeDef USART_InitStructure;
/* 定义USART初始化结构体 USART_ClockInitStructure */
USART_ClockInitTypeDef USART_ClockInitStructure;
// Enable USART2 and GPIO clocks
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);// GPIOD USART2 remap
////USART2口初始化 Set PORTD 5,7 as Output push-pull - SCK and MOSI
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING;;
GPIO_Init(GPIOD, &GPIO_InitStructure);
USART_ClockInitStructure.USART_Clock = USART_Clock_Enable;
USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;
USART_ClockInitStructure.USART_CPHA = USART_CPHA_1Edge;
USART_ClockInitStructure.USART_LastBit = USART_LastBit_Enable;
USART_ClockInit(USART2 , &USART_ClockInitStructure);
USART_InitStructure.USART_BaudRate =2000000;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART2 , &USART_InitStructure);
/* 使能USART1 */
USART_Cmd(USART2 , ENABLE);
}
//********************************************USART2配置****************************
u8 SPI_ReadWriteByte(u8 TxData) //SPI读写数据函数
{ u8 tx=0;
u8 retry=0;
u8 re=0;
u8 re2=0;
// LSB to MSB //
for(u8 i=0;i<8;i++)
{
if(TxData&0x80)
tx|=0x80;
if(i!=7)tx>>=1;
TxData<<=1;
}
/* Loop while DR register in not emplty */
while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET) //发送缓存标志位为空
{
retry++;
if(retry>200)return 0;
}
/* Send tx */
USART_SendData(USART2, tx); //发送一个数据
/* Wait to receive a byte */
while (USART_GetFlagStatus(USART2,USART_FLAG_RXNE) == RESET) //接收缓存标志位不为空
{
}
// Return the byte read from the SPI bus
return USART_ReceiveData(USART2); //返回接收数据
}
//***************************************读写程序***************
测试程序
void test1(void)
{ u8 st1,st2,st3;
// SPI_ReadWriteByte(SPI_WRITE_REG+TX_ADDR);
NRF24L01_Write_Reg(SPI_WRITE_REG+TX_ADDR,0x83);
while(1)
{
st1= NRF24L01_Read_Reg(TX_ADDR);
}
}
//通过SPI写寄存器
u8 NRF24L01_Write_Reg(u8 regaddr,u8 data)
{
u8 status;
Clr_NRF24L01_CSN; //使能SPI传输
status =SPI_ReadWriteByte(regaddr); //发送寄存器号
SPI_ReadWriteByte(data); //写入寄存器的值
//禁止SPI传输
return(status); //返回状态值
}
//读取SPI寄存器值 ,regaddr:要读的寄存器
u8 NRF24L01_Read_Reg(u8 regaddr)
{
u8 reg_val;
Clr_NRF24L01_CSN; //使能SPI传输
SPI_ReadWriteByte(regaddr); //发送寄存器号
reg_val=SPI_ReadWriteByte(0XFF);//读取寄存器内容
Set_NRF24L01_CSN; //禁止SPI传输
return(reg_val); //返回状态值
}
程序就阻在这!
while (USART_GetFlagStatus(USART2,USART_FLAG_RXNE) == RESET) //接收缓存标志位不为空
我检查了 STM32 硬件这几个引脚肯定是可靠连接了;
我降低了速率,还是这个样!
不知道再重哪里入手了!求助 求助 求助 !头大了!
[
本帖最后由 shirl 于 2012-8-19 14:54 编辑 ]
此帖出自
小平头技术问答
一周热门 更多>