OpenEdv-开源电子网

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

ENC28J60的一个SPI问题.

[复制链接]

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2012-7-19
在线时间
0 小时
发表于 2013-7-21 16:56:53 | 显示全部楼层 |阅读模式
一个ENC28J60的程序我用LPC2109能用,由于RAM原因尝试移植到STM32上, 但是程序到读数据的的时候移植读不出来。最近两天才看STM32手册跟原子大哥的程序做的,求看看是不是SPI,GPIO设置问题。
由于是这两天才看的STM32,寄存器的配置是按照正点原子提供的代码。


SPI初始化代码,使用的是SPI1 PA口的
  1. void SPI_init()
  2. {
  3. /*PORTA时钟使能*/
  4. RCC->APB2ENR |= 1 << 2;
  5. /*SPI1时钟使能*/
  6. RCC->APB2ENR |= 1 << 12;
  7. /*PA5,6,7复用上拉*/
  8. GPIOA->CRL &= 0x000fffff;
  9. GPIOA->CRL |= 0xbbb00000;
  10. GPIOA->ODR |= 0x07 << 5;
  11. /*SPI设置*/
  12. SPI1->CR1 |= 0 << 10; //全双工
  13. SPI1->CR1 |= 1 << 9;     //nss管理
  14. SPI1->CR1 |= 1 << 8;
  15. SPI1->CR1 |= 1 << 2;    //SPI主机
  16. SPI1->CR1 |= 0 << 11;    //8bit数据格式
  17. SPI1->CR1 |= 0 << 1;     //CPOL = 0,空闲SCK为0
  18. SPI1->CR1 |= 0 << 0;     //CPHA = 0,第1个时钟边沿采样
  19. SPI1->CR1 |= 3 << 3;    //SPI速率,9MHz
  20. SPI1->CR1 |= 0 << 7;     //MSBfirst
  21. /*SPI使能*/
  22. SPI1->CR1 |= 1 << 6;
  23. }


  24. u8 SPI_read_byte(void)
  25. {
  26. while (!(SPI1->SR & 1));
  27. return SPI1->DR;
  28. }

  29. void SPI_write_byte(u8 data)
  30. {
  31. while (!(SPI1->SR & (1 << 1)));
  32. SPI1->DR = data;

  33. }


这里是ENC28J6O引脚的一些初始化代码。

这是ENC28J60关键地方我改的代码,其他地方应该没问题
/*定义ENC28J60的连接引脚*/
#define ENC28J60_CONTROL_RESET 0
#define ENC28J60_CONTROL_CS 4

#define CS_ACTIVE PAout(ENC28J60_CONTROL_CS) = 0
#define CS_PASSIVE PAout(ENC28J60_CONTROL_CS) = 1

  1. void enc28j60_power(void)
  2. {
  3. RCC->APB2ENR |= 1 << 2;
  4. GPIOA->CRL &= 0xfffffff0;
  5. GPIOA->CRL |= 0x00000003;
  6. PAout(ENC28J60_CONTROL_RESET) = 0;
  7. delay_ms(10);
  8. PAout(ENC28J60_CONTROL_RESET) = 1;
  9. delay_ms(200);
  10. GPIOA->CRL &= 0xfff0ffff;
  11. GPIOA->CRL |= 0x00030000;
  12. PAout(ENC28J60_CONTROL_CS) = 0;
  13. delay_ms(200);
  14. SPI_init();
  15. CS_PASSIVE;
  16. }



main函数的代码使用的是UIP里面的。
  1. while (1) {
  2. uip_len = tapdev_read();    //每次到这里读取数据的时候就读取不到了。一直在ENC28J60里面的SPI读取等待。、
  3. if (uip_len > 0) {
  4. if (BUF->type == htons(UIP_ETHTYPE_IP)) {
  5. uip_arp_ipin();
  6. uip_input();
  7. if (uip_len > 0) {
  8. uip_arp_out();
  9. tapdev_send();
  10. }
  11. } else if (BUF->type == htons(UIP_ETHTYPE_ARP)) {
  12. uip_arp_arpin();
  13. if (uip_len > 0) {
  14. tapdev_send();
  15. }
  16. }
  17. } else if (timer_expired(&periodic_timer)) {
  18. timer_reset(&periodic_timer);
  19. for (i = 0; i < UIP_CONNS; i++) {
  20. uip_periodic(i);
  21. if (uip_len > 0) {
  22. uip_arp_out();
  23. tapdev_send();
  24. }
  25. }
  26. if (timer_expired(&arp_timer)) {
  27. timer_reset(&arp_timer);
  28. uip_arp_timer();
  29. }
  30. }
  31. }
  32. }









To be
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-7-21 20:14:26 | 显示全部楼层
回复【楼主位】shangshipei:
---------------------------------
enc28j60初始化通过了么?
我们的例程有初始化代码的,通过往enc28j60写入数据,再读出数据,来对比是不是相等,从而判断是不是正常的.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2012-7-19
在线时间
0 小时
 楼主| 发表于 2013-7-22 15:23:20 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
初始化是通过的,我试试你说的这个方法。
To be
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2012-7-19
在线时间
0 小时
 楼主| 发表于 2013-7-22 16:11:39 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
SPI一直读不出来数据,= = 好像还是SPI或者GPIO设置问题。我再看看吧
To be
回复 支持 反对

使用道具 举报

2

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
114
金钱
114
注册时间
2013-9-20
在线时间
13 小时
发表于 2013-9-22 23:15:43 | 显示全部楼层
回复【4楼】shangshipei:
---------------------------------你好,我也是这样的uip_len 的值始终都是0啊 ,而且我的板子ping不通啊 你的弄好了没有啊?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-12 17:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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