OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 10253|回复: 18

老大,帮看下有木有错,很短的代码

[复制链接]

71

主题

467

帖子

0

精华

高级会员

Rank: 4

积分
800
金钱
800
注册时间
2011-11-18
在线时间
5 小时
发表于 2012-6-27 03:26:01 | 显示全部楼层 |阅读模式

在外星人板子上的这个 NRF2401 的IO设置有没错呢,我的代码读出的数全是 8. 我还没学片内的SPI,我是用IO模拟的.你看下我这样设的IO有木有问题.

/初始化24L01的IO口
void NRF24L01_Init(void)
{
 RCC->APB2ENR|=1<<2;    //使能PORTA口时钟
 RCC->APB2ENR|=1<<4;    //使能PORTC口时钟
 
 GPIOA->CRL&=0X0000FFFF;  //MOSI MISO SCK CE
 GPIOA->CRL|=0X38330000;
 GPIOA->ODR|=0xf0;            //PA4.5.6.7 输出 
 GPIOC->CRL&=0XFF00FFFF;       //PC4 CSN 输出     PC5 IRQ 输入
 GPIOC->CRL|=0X00830000;
 GPIOC->ODR|=0x30;//3<<4;    //上拉 

 NRF24L01_CE=0;
 NRF24L01_CSN=1; //SPI片选取消
 NRF24L01_SCK =0; //时钟置底          
}

后来翻看你写的代码
你的这个    

//初始化24L01的IO口
void NRF24L01_Init(void)
{
 RCC->APB2ENR|=1<<2;    //使能PORTA口时钟
 RCC->APB2ENR|=1<<4;    //使能PORTC口时钟
 GPIOA->CRL&=0XFFF000FF;//PA4输出
 GPIOA->CRL|=0X00033300;
 GPIOA->ODR|=7<<2;    //PA2.3.4 输出1  
 GPIOC->CRL&=0XFF00FFFF;//PC4输出 PC5输出
 GPIOC->CRL|=0X00830000;
 GPIOC->ODR|=3<<4;    //上拉 
 SPIx_Init();    //初始化SPI
 NRF24L01_CE=0;  //使能24L01
 NRF24L01_CSN=1; //SPI片选取消          
}


GPIOA->CRL|=0X00033300;
GPIOA->ODR|=7<<2;    //PA2.3.4 输出1  <<====为什么有 PA2.3.4 呢,没用的呀~~~~~看电路图,接的是  PA5.6.7脚才对呀.

搞好二个多小时,读出来的数就是8 ,郁闷死了.

明天得带个逻辑分析仪回来才行...........................

我的工作就是天天在玩
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2196
金钱
2196
注册时间
2012-2-8
在线时间
35 小时
发表于 2012-6-27 07:34:54 | 显示全部楼层
GPIOA->ODR|=7<<2;    //PA2.3.4 输出1

SPI总线上其他SPI器件的片选脚。
https://github.com/roxma
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2196
金钱
2196
注册时间
2012-2-8
在线时间
35 小时
发表于 2012-6-27 09:00:46 | 显示全部楼层
 SPIx_Init();    //初始化SPI

里面配置的是AF输出还是PP输出?
https://github.com/roxma
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-6-27 09:13:07 | 显示全部楼层
 对,2,3,4是要禁止其他SPI设备,否则总线冲突...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

71

主题

467

帖子

0

精华

高级会员

Rank: 4

积分
800
金钱
800
注册时间
2011-11-18
在线时间
5 小时
 楼主| 发表于 2012-6-27 12:54:03 | 显示全部楼层
沒有其它的SPI设备了,234脚是沒有用的,NRF2401接了567脚
我的工作就是天天在玩
回复 支持 反对

使用道具 举报

71

主题

467

帖子

0

精华

高级会员

Rank: 4

积分
800
金钱
800
注册时间
2011-11-18
在线时间
5 小时
 楼主| 发表于 2012-6-27 13:23:45 | 显示全部楼层
6个脚全设了.
好象没错呀,大家帮忙看一下
我的工作就是天天在玩
回复 支持 反对

使用道具 举报

71

主题

467

帖子

0

精华

高级会员

Rank: 4

积分
800
金钱
800
注册时间
2011-11-18
在线时间
5 小时
 楼主| 发表于 2012-6-27 13:54:06 | 显示全部楼层
问题找到了,u8 SPIx_ReadWriteByte(u8 data)函数的

NRF24L01_MOSI=(data&0x80);

写成这样就行了,
for (i=0;i<8;i++)
{
if((temp&0x80)==0)
{
NRF24L01_MOSI=0;
}
else
{
NRF24L01_MOSI=1;
}

为啥呢,不是一样的吗??..................怪了.  if((temp&0x80)==0)的这写成if(temp&0x80==0)都不行......

我的工作就是天天在玩
回复 支持 反对

使用道具 举报

71

主题

467

帖子

0

精华

高级会员

Rank: 4

积分
800
金钱
800
注册时间
2011-11-18
在线时间
5 小时
 楼主| 发表于 2012-6-27 13:54:38 | 显示全部楼层
编译软件的问题???

我的工作就是天天在玩
回复 支持 反对

使用道具 举报

71

主题

467

帖子

0

精华

高级会员

Rank: 4

积分
800
金钱
800
注册时间
2011-11-18
在线时间
5 小时
 楼主| 发表于 2012-6-27 13:55:24 | 显示全部楼层
全程如下:

u8 SPIx_ReadWriteByte(u8 data)
{
u8 i,temp;
temp=data;

for (i=0;i<8;i++)
{
if((temp&0x80)==0)
{
NRF24L01_MOSI=0;
}
else
{
NRF24L01_MOSI=1;
}
// NRF24L01_MOSI=(data&0x80);
data=(data<<1);//data<<=1;
temp=data;

NRF24L01_SCK =1;  //时钟线 上升沿 的时候 从机丢到主机

data |=NRF24L01_MISO;
delay_us(10);

NRF24L01_SCK =0;        //时钟线 下降沿 的时候 从主机丢到从机
delay_us(10);
}

我的工作就是天天在玩
回复 支持 反对

使用道具 举报

71

主题

467

帖子

0

精华

高级会员

Rank: 4

积分
800
金钱
800
注册时间
2011-11-18
在线时间
5 小时
 楼主| 发表于 2012-6-27 13:55:51 | 显示全部楼层
后来才加的

temp=data;
我的工作就是天天在玩
回复 支持 反对

使用道具 举报

71

主题

467

帖子

0

精华

高级会员

Rank: 4

积分
800
金钱
800
注册时间
2011-11-18
在线时间
5 小时
 楼主| 发表于 2012-6-27 13:58:45 | 显示全部楼层
郁闷呀,搞了一晚原来这里
我的工作就是天天在玩
回复 支持 反对

使用道具 举报

71

主题

467

帖子

0

精华

高级会员

Rank: 4

积分
800
金钱
800
注册时间
2011-11-18
在线时间
5 小时
 楼主| 发表于 2012-6-27 13:59:02 | 显示全部楼层
但还是不懂为啥错
我的工作就是天天在玩
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-6-27 15:19:14 | 显示全部楼层
回复【7楼】chinafox:
---------------------------------
把0X80赋值给一个bool类型的数据,结果是多少?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

71

主题

467

帖子

0

精华

高级会员

Rank: 4

积分
800
金钱
800
注册时间
2011-11-18
在线时间
5 小时
 楼主| 发表于 2012-6-27 16:47:15 | 显示全部楼层
是的,

bool取值false和true,是0和1的区别; false可以代表0,但true有很多种,并非只有1。   如果数个bool对象列在一起,可能会各占一个bit,这取决于编译器。 

换上去应可以,说白了就是群体bit.

我的程式中的 data 这样定义应行了:

bool data;



我的工作就是天天在玩
回复 支持 反对

使用道具 举报

71

主题

467

帖子

0

精华

高级会员

Rank: 4

积分
800
金钱
800
注册时间
2011-11-18
在线时间
5 小时
 楼主| 发表于 2012-6-27 16:47:44 | 显示全部楼层
bool 数据类型偶从没用过,这次学习了。
我的工作就是天天在玩
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2196
金钱
2196
注册时间
2012-2-8
在线时间
35 小时
发表于 2012-6-28 01:23:51 | 显示全部楼层
没有其它 SPI 设备?楼主用的不是原子哥的板子吗?

6楼的问题是运算优先级的问题,好像这之前提过,多加括号是有好处的。

另外,对于 bool 在使用的时候,最好是只认为只有 true 和 false 两种情况,用的时候尽量不要直接用 0 和 1之类的具体数值,至少要从可读性上考虑。bool 只用来直接赋值 true false或者其它bool类型的变量,和if的判断和 !操作符,不应该和其它类型的数据直接进行运算,这样代码表达的意思才会比较明确。
而且,对于官方库定义的 BOOL,和C++内建的BOOL是不同的,比如
bool a = 0x80;
那么 (a == TRUE) 这个表达式的值为 FALSE,具体原因楼主可以补补C语言枚举的内容。
如果是C++内建的bool,上面的表达式的值就为 true,但是 bool a = 0x80 的这种写法是不规范的,不规范的用法最容易出现问题。
https://github.com/roxma
回复 支持 反对

使用道具 举报

71

主题

467

帖子

0

精华

高级会员

Rank: 4

积分
800
金钱
800
注册时间
2011-11-18
在线时间
5 小时
 楼主| 发表于 2012-6-28 04:42:15 | 显示全部楼层
嗯嗯 
拜读了~~~~~~~~~~~~~~~
我的工作就是天天在玩
回复 支持 反对

使用道具 举报

71

主题

467

帖子

0

精华

高级会员

Rank: 4

积分
800
金钱
800
注册时间
2011-11-18
在线时间
5 小时
 楼主| 发表于 2012-6-28 04:46:07 | 显示全部楼层
回复【16楼】Pony279:

---------------------------------
没有其它SPI设备了,拨掉了,偶现在用的是原子的两块学习板.

明天再叫MM帮我去原子那买多一块屏回来,刚买的屏还木有板子焊上去.先买多一块再说,就多一个汉堡包的价格.
我的工作就是天天在玩
回复 支持 反对

使用道具 举报

71

主题

467

帖子

0

精华

高级会员

Rank: 4

积分
800
金钱
800
注册时间
2011-11-18
在线时间
5 小时
 楼主| 发表于 2012-6-28 04:46:52 | 显示全部楼层
原子老大,你的生意又来了....=.=Y
我的工作就是天天在玩
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 08:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表