Hallo,
wie lese ich genau mit einem MEGA32U4 3 Bytes ein?
Habe folgendes Versucht.:
main
CodeBox C
spi
CodeBox C
CodeBox C
Was genau mache ich falsch?
1 Byte empfangen und korrekt auswerten klappt.
wie lese ich genau mit einem MEGA32U4 3 Bytes ein?
Habe folgendes Versucht.:
main
CodeBox C
int main(void) { DDRD |= (1<<PD5); lcd_init(LCD_DISP_ON); spi_master_init(64,2); while (1) { lcd_gotoxy(0,0); int8_t tmp = ADE7758_readTEMP(); sprintf(Buffer,"T:%d", tmp); lcd_puts(Buffer); _delay_ms(10); spi_enable_chip(); spi_disable_chip(); spi_master_transmit(REG_BVRMS); spi_master_transmit(0x00); int8_t byte_one = (int8_t)spi_receive(); sprintf(Buffer," 1:%d", byte_one); lcd_puts(Buffer); spi_master_transmit(0x00); int8_t byte_two = (int8_t)spi_receive(); sprintf(Buffer," 2:%d", byte_two); lcd_puts(Buffer); spi_master_transmit(0x00); int8_t byte_three = spi_receive(); sprintf(Buffer," 3:%d", byte_three); lcd_puts(Buffer); spi_enable_chip(); unsigned long messwert = (unsigned long)16<<byte_one | (unsigned long)8 << byte_two |(signed long)byte_one; long voltage = ((long)messwert / FULL_SCALE_VRMS) * RMS_SPANNUNG_MAX; lcd_gotoxy(0,1); sprintf(Buffer,"L1: %lu", voltage); lcd_puts(Buffer); _delay_ms(800); } }
spi
CodeBox C
void spi_master_transmit(uint8_t cData) { /* start transmission */ SPDR = cData; /* wait for transmission complete */ while(!(SPSR & (1<<SPIF))); } uint8_t spi_receive(void) { /* Wait for reception complete */ //while(!(SPSR & (1<<SPIF))); /* return data register */ return SPDR; }
CodeBox C
void spi_master_init(uint8_t prescaler, uint8_t clock_option) { /* ONLY FOR MEGA32! */ #if defined(__AVR_ATmega32__) { /* set MOSI and SCK output, all others input */ MOSI_DDR |= (1<<MOSI_BIT); SCK_DDR |= (1<<SCK_BIT); SS_DDR |= (1<<SS_BIT); /* enable SPI, Master */ SPCR |= (1<<SPE) | (1<<MSTR); /* clear the bit´s (for multi init) */ SPCR &= ~((1<<SPI2X) | (1<<SPR0) | (1<<SPR1)); // fclk/4 /* config SPI Bus Speed fclk/prescaler */ switch (prescaler) { case 2: {SPCR |= (1<<SPI2X); };break; case 8: {SPCR |= ((1<<SPI2X) | (1<<SPR0)); };break; case 32: {SPCR |= ((1<<SPI2X) | (1<<SPR1)); };break; case 64: {SPCR |= ((1<<SPI2X) | (1<<SPR1) | (1<<SPR0));};break; default: {SPCR |= (1<<SPI2X); };break; } } #endif /* ONLY FOR MEGA32U4! */ #if defined (__AVR_ATmega32U4__) { /* set MOSI and SCK output, all others input */ MOSI_DDR |= (1<<MOSI_BIT); SCK_DDR |= (1<<SCK_BIT); SS_DDR |= (1<<SS_BIT); // software slave select signal SS_HA_DDR |= (1<<SS_HA_BIT); // hardware slave select signal /* enable SPI, Master */ SPCR |= ((1<<SPE) | (1<<MSTR)); /* config "Clock Polarity and "Clock Phase" */ switch(clock_option) { case 0 : {SPCR &= ~((1<<CPOL) | (1<<CPHA)); }break; // mode 1 case 1 : {SPCR |= (1<<CPHA); }break; // mode 2 case 2 : {SPCR |= (1<<CPOL); }break; // mode 3 case 3 : {SPCR |= ((1<<CPOL) | (1<<CPHA)); }break; // mode 4 } /* config SPI Bus Speed fclk/prescaler */ switch (prescaler) { case 2: {SPSR |= (1<<SPI2X); }break; // prescaler 2 case 8: {SPSR |= (1<<SPI2X); SPCR |= (1<<SPR0); }break; // prescaler 8 case 32: {SPSR |= (1<<SPI2X); SPCR |= (1<<SPR1); }break; // prescaler 32 case 64: {SPSR |= (1<<SPI2X); SPCR |= (1<<SPR1) | (1<<SPR0); }break; // prescaler 64 default: {SPSR |= (1<<SPI2X); }break; // default = 2 } } #endif }
Was genau mache ich falsch?
1 Byte empfangen und korrekt auswerten klappt.