Добрый день. Решил подключить DFRduino Ethernet Shield к MSP-EXP430G2533 по SPI интерфейсу, но возникли трудности. Делаю по даташиту:
- Передаю opcode 0xf0 для записи
- Младшие 8 бит адреса регистра (в ответ в приемном буфере появляется 0x01 при отладке)
- Старшие 8 бит адреса регистра (в ответ в приемном буфере появляется 0x02 при отладке)
- Данные (а тут чаще всего появляется 0x00, хотя должно быть 0x03 при записи, а при чтении собственно значение регистра)
Иногда проходит, и даже читает регистр, но чаще всего нет.
Пробовал изменять скорость не помогает. Вот код, все просто. Но не могу понять в чем дело. И как правильно принять данные из приемного буфера. Раньше с SPI не работал. Делаю в Code Composer Studio 5.2.1.
Код
#include <msp430g2553.h>
unsigned int i = 0;
void writeB(unsigned int addr, unsigned char data){
P2OUT &= ~BIT5; //SS Low
UCB0TXBUF = 0xF0; // Send write opcode
while (!(IFG2 & UCB0TXIFG));
UCB0TXBUF = (addr & 0xFF00) >> 8;
while (!(IFG2 & UCB0TXIFG) && UCB0RXBUF!=0x01);
UCB0TXBUF = addr & 0x00FF;
while (!(IFG2 & UCB0TXIFG) && UCB0RXBUF!=0x02);
UCB0TXBUF = data;
while (!(IFG2 & UCB0TXIFG) && UCB0RXBUF!=0x03);
P2OUT |= BIT5; //SS Hight
}
void readB(unsigned int addr){
P2OUT &= ~BIT5; //SS Low
UCB0TXBUF = 0x0F; // Send read opcode
while (!(IFG2 & UCB0TXIFG));
UCB0TXBUF = (addr & 0xFF00) >> 8;
while (!(IFG2 & UCB0TXIFG) && UCB0RXBUF!=0x01);
UCB0TXBUF = addr & 0x00FF;
while (!(IFG2 & UCB0TXIFG) && UCB0RXBUF!=0x02);
UCB0TXBUF = 0x00;
while (!(IFG2 & UCB0TXIFG) && UCB0RXBUF==0x02);
i = UCB0RXBUF;
P2OUT |= BIT5; //SS Hight
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
P1DIR |= BIT0; // Led DIR
P1OUT |= BIT0; // Led OUT
P1SEL |= BIT5 + BIT6 + BIT7; //CLK + MISO + MOSI
P1SEL2 |= BIT5 + BIT6 + BIT7; //CLK + MISO + MOSI
P2DIR |= BIT0 + BIT5; //reset pin + SS
P2OUT |= BIT0 + BIT5; //reset pin + SS
//Init SPI
UCB0CTL1 |= BIT0;
UCB0CTL0 = 0x29;
UCB0CTL1 |= BIT7 + BIT6;
UCB0BR0 = 0x04;
UCB0BR1 = 0x00;
UCB0CTL1 &= ~BIT0; // Lets go!
//Init Wiznet
P2OUT &= ~BIT0; //reset w5100
__delay_cycles(100000);
P2OUT |= BIT0;
writeB(0x0000, 0x80); //Soft reset MR
writeB(0x0016,0x00); //IMR
writeB(0x0017,0x0F); //RTR1
writeB(0x0018,0xA0); //RTR2
writeB(0x0019,0x08); //RCR
readB(0x0019);
for (;;) {
P1OUT |= BIT0;
__delay_cycles(100000);
P1OUT &= ~BIT0;
__delay_cycles(100000);
}
}
Вот фото
https://docs.google.com/file/d/0B4fYmLl01kZ...dit?usp=sharing