在线时间0 小时
UID415447
ST金币0
蝴蝶豆0
注册时间2009-10-24
新手上路
- 最后登录
- 1970-1-1
|
a0a.1 0b0c
最近买了几块NRF24L01的蓝牙模块,用的单片机是STM8S103K3搞了,连接蓝牙模块搞了好几天也没搞出什么名堂,网上找了不少程序,找的不少都是一个版本的,自己试着改改也没用,最后删的就剩下读取NRF24L01的某一寄存器的值,显示在八位的led上,然后对照一下该寄存器的默认值,来确定下通讯成功没,结果读取到的和默认值也不一样,有时读取到的还是固定值,用的是单片机的SPI接口,感觉程序也没什么问题,无奈!!! 程序贴出来 哪位大侠帮忙看看那里的问题 (焊接的两块板子 四块蓝牙模块 而且硬件电路对照了 也没有什么问题)
/* MAIN.C file
*
* Copyright (c) 2002-2005 STMicroelectronics
*/
#include
#include
#define uchar unsigned char
#define NRF24L01_CEH PB_ODR=PB_ODR|0x01 //NRF24L01 CE置高
#define NRF24L01_CEL PB_ODR=PB_ODR&0xFE //NRF24L01 CE置低
#define NRF24L01_CSNH PB_ODR=PB_ODR|0x04 //NRF24L01 CSN置高
#define NRF24L01_CSNL PB_ODR=PB_ODR&0xFB //NRF24L01 CSN置低
#define LED PD_ODR //定义输出LED
#define PE5_IN (PE_IDR&0X20) //定义按键
void init_io(void) //初始化
{
PB_DDR=0X06; //配置PB1(CE) BP2(CSN)为输出模式
PB_CR1=0X06;
NRF24L01_CEL; //CE置低
NRF24L01_CSNH;//SPI 禁止
PD_DDR=0XFF; //配置为开漏输出模式
PD_DDR=0XFF; //PD口配置为输出(包含IRQ)
PD_ODR=0X80; //IRQ输出高
PD_DDR=0X7F; //IRQ为输入模式
PD_CR1=0XfF; //配置其他端口为推挽输出
PE_DDR=0Xdf;
PE_CR1=0X20; //PE5设置为上拉输入(按键
PE_CR2=0X00;
}
unsigned char SPI_RW(unsigned char byte) //写一个字节
{
while(!(SPI_SR & 0x02)); /* 等待发送寄存器为空 */
SPI_DR = byte; /* 将发送的数据写到数据寄存器 */
while(!(SPI_SR & 0x01)); /* 等待接受寄存器满 */
return SPI_DR; /* 读数据寄存器 */
}
uchar SPI_Read(uchar reg) //读寄存器里的内容
{
uchar reg_val;
NRF24L01_CSNL; // CSN置低,开始传输数据
SPI_RW(reg); // 选择寄存器
reg_val = SPI_RW(0); // 然后从该寄存器读数据
NRF24L01_CSNH; // CSN拉高,结束数据传输
return(reg_val); // 返回寄存器数据
}
void main()
{
uchar n;
CLK_ECKR|=0X1;//开启外部时
while(!(CLK_ECKR&0X2));//等待外部时钟
CLK_CKDIVR&=0XF8;//CPU无分
CLK_SWR=0XB4;//选择外部时
while(!(CLK_SWCR&0X8));//这里要
CLK_SWCR|=0X2;//使能外部
SPI_CR1=0X2c; //配置SPI模式 暂时禁止SPI等待配置完成再打开
SPI_CR2=0X03; //配置SPI模式
SPI_ICR = (0 |
|