一个ENC28J60的程序我用LPC2109能用,由于RAM原因尝试移植到STM32上, 但是程序到读数据的的时候移植读不出来。最近两天才看STM32手册跟原子大哥的程序做的,求看看是不是SPI,GPIO设置问题。
由于是这两天才看的STM32,寄存器的配置是按照正点原子提供的代码。
SPI初始化代码,使用的是SPI1 PA口的
- void SPI_init()
- {
- /*PORTA时钟使能*/
- RCC->APB2ENR |= 1 << 2;
- /*SPI1时钟使能*/
- RCC->APB2ENR |= 1 << 12;
- /*PA5,6,7复用上拉*/
- GPIOA->CRL &= 0x000fffff;
- GPIOA->CRL |= 0xbbb00000;
- GPIOA->ODR |= 0x07 << 5;
- /*SPI设置*/
- SPI1->CR1 |= 0 << 10; //全双工
- SPI1->CR1 |= 1 << 9; //nss管理
- SPI1->CR1 |= 1 << 8;
- SPI1->CR1 |= 1 << 2; //SPI主机
- SPI1->CR1 |= 0 << 11; //8bit数据格式
- SPI1->CR1 |= 0 << 1; //CPOL = 0,空闲SCK为0
- SPI1->CR1 |= 0 << 0; //CPHA = 0,第1个时钟边沿采样
- SPI1->CR1 |= 3 << 3; //SPI速率,9MHz
- SPI1->CR1 |= 0 << 7; //MSBfirst
- /*SPI使能*/
- SPI1->CR1 |= 1 << 6;
- }
- u8 SPI_read_byte(void)
- {
- while (!(SPI1->SR & 1));
- return SPI1->DR;
- }
- void SPI_write_byte(u8 data)
- {
- while (!(SPI1->SR & (1 << 1)));
- SPI1->DR = data;
- }
这里是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
- void enc28j60_power(void)
- {
- RCC->APB2ENR |= 1 << 2;
- GPIOA->CRL &= 0xfffffff0;
- GPIOA->CRL |= 0x00000003;
- PAout(ENC28J60_CONTROL_RESET) = 0;
- delay_ms(10);
- PAout(ENC28J60_CONTROL_RESET) = 1;
- delay_ms(200);
- GPIOA->CRL &= 0xfff0ffff;
- GPIOA->CRL |= 0x00030000;
- PAout(ENC28J60_CONTROL_CS) = 0;
- delay_ms(200);
- SPI_init();
- CS_PASSIVE;
- }
main函数的代码使用的是UIP里面的。
- while (1) {
- uip_len = tapdev_read(); //每次到这里读取数据的时候就读取不到了。一直在ENC28J60里面的SPI读取等待。、
- if (uip_len > 0) {
- if (BUF->type == htons(UIP_ETHTYPE_IP)) {
- uip_arp_ipin();
- uip_input();
- if (uip_len > 0) {
- uip_arp_out();
- tapdev_send();
- }
- } else if (BUF->type == htons(UIP_ETHTYPE_ARP)) {
- uip_arp_arpin();
- if (uip_len > 0) {
- tapdev_send();
- }
- }
- } else if (timer_expired(&periodic_timer)) {
- timer_reset(&periodic_timer);
- for (i = 0; i < UIP_CONNS; i++) {
- uip_periodic(i);
- if (uip_len > 0) {
- uip_arp_out();
- tapdev_send();
- }
- }
- if (timer_expired(&arp_timer)) {
- timer_reset(&arp_timer);
- uip_arp_timer();
- }
- }
- }
- }
|