<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=4&amp;t=13498&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-11-07T20:21:00+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=13498&amp;mode</id>
<entry>
<author><name><![CDATA[Def]]></name></author>
<updated>2015-11-07T20:21:00+01:00</updated>
<published>2015-11-07T20:21:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13498&amp;p=144735#p144735</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13498&amp;p=144735#p144735"/>
<title type="html"><![CDATA[ADE7763 odczytanie danych przez SPI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13498&amp;p=144735#p144735"><![CDATA[
Witam<br /><br />Próbuje przy pomocy atmegi328p z kwarcem 11,0592MHz porozumieć się z ade7763 przy pomocy SPI. W nocie znalazłem, że należy ustawić bit CPHA. Delaye po każdym zapisie/odczycie według noty powinny wynosić 4us, które również są. Niestety od ade otrzymuje w odpowiedzi losowe liczby.<br />Czy ktoś miał może podobny problem? <br />schemat: <!-- m --><a class="postlink" href="http://prntscr.com/905kt7" >http://prntscr.com/905kt7</a><!-- m --> zapomniałem o wartości R1=10k<br /><br />kod:<br /><br />main.c<br />[syntax=c]#include &lt;stdlib.h&gt;<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &quot;UART/UART.h&quot;<br />//#include &quot;terminal/tr.h&quot;<br />#include &quot;SPI/spi.h&quot;<br />#include &quot;ade7763.h&quot;<br /><br />unsigned char data;<br /><br />int main(){<br />sei();<br />UART_init();<br />SpiInit();<br />while(1){<br />UART_sendstr(&quot;Read: &quot;);<br />CS_L;<br />_delay_us(10);<br />Read_SPI(0x3f, &amp;data, 1);<br />_delay_us(10);<br />CS_H;<br />_delay_ms(2000);<br />}<br /><br />}[/syntax]<br /><br />ade7763.h<br />[syntax=c]#ifndef ADE7763_H_<br />#define ADE7763_H_<br /><br /><br />#define DEBUG 0<br /><br />// SPI definitions<br />#define SCK PB5<br />#define MISO PB4<br />#define MOSI PB3<br />#define CS PB2<br /><br />#define CS_PORT PORTB<br />#define CS_DDR DDRB<br />#define CS_PIN (1&lt;&lt;CS);<br />#define CS_L CS_PORT &amp;= ~CS_PIN<br />#define CS_H CS_PORT |= CS_PIN<br /><br /><br /><br />//<br />//Analog Devices ADE7763 Energy Meter Chip<br />//****************************************<br />//<br />//MR_ = Meter Register<br />//<br />//In general, names and abbreviations are as used in ADE7763 data sheet<br />//<br /><br />//<br />//Register Address Definitions<br />//<br /><br />#defineMR_Reserv000x00<br />#defineMR_WFORM        0x01<br />#defineMR_AENERGY      0x02<br />#defineMR_RAENERGY     0x03<br />#defineMR_LAENERGY     0x04<br />#defineMR_VAENERGY     0x05<br />#defineMR_RVAENERGY    0x06<br />#defineMR_LVAENERGY    0x07<br />#defineMR_Reserv08     0x08<br />#defineMR_MODE         0x09<br />#defineMR_IRQEN        0x0A<br />#defineMR_STATUS       0x0B<br />#defineMR_RSTATUS      0x0C<br />#defineMR_CH1OS        0x0D<br />#defineMR_CH2OS        0x0E<br />#defineMR_GAIN         0x0F<br />#defineMR_PHCAL        0x10<br />#defineMR_APOS         0x11<br />#defineMR_WGAIN        0x12<br />#defineMR_WDIV         0x13<br />#defineMR_CFNUM        0x14<br />#defineMR_CFDEN        0x15<br />#defineMR_IRMS         0x16<br />#defineMR_VRMS         0x17<br />#defineMR_IRMSOS       0x18<br />#defineMR_VRMSOS       0x19<br />#defineMR_VAGAIN       0x1A<br />#defineMR_VADIV        0x1B<br />#defineMR_LINCYC       0x1C<br />#defineMR_ZXTOUT       0x1D<br />#defineMR_SAGCYC       0x1E<br />#defineMR_SAGLVL       0x1F<br />#defineMR_IPEAKLVL     0x20<br />#defineMR_VPEAKLVL     0x21<br />#defineMR_IPEAK        0x22<br />#defineMR_RIPEAK       0x23<br />#defineMR_VPEAK        0x24<br />#defineMR_RVPEAK       0x25<br />#defineMR_TEMP         0x26<br />#defineMR_PERIOD       0x27<br />#defineMR_Reserv28     0x28<br />#defineMR_Reserv29     0x29<br />#defineMR_Reserv2A     0x2A<br />#defineMR_Reserv2B     0x2B<br />#defineMR_Reserv2C     0x2C<br />#defineMR_Reserv2D     0x2D<br />#defineMR_Reserv2E     0x2E<br />#defineMR_Reserv2F     0x2F<br />#defineMR_Reserv30     0x30<br />#defineMR_Reserv31     0x31<br />#defineMR_Reserv32     0x32<br />#defineMR_Reserv33     0x33<br />#defineMR_Reserv34     0x34<br />#defineMR_Reserv35     0x35<br />#defineMR_Reserv36     0x36<br />#defineMR_Reserv37     0x37<br />#defineMR_Reserv38     0x38<br />#defineMR_Reserv39     0x39<br />#defineMR_Reserv3A     0x3A<br />#defineMR_Reserv3B     0x3B<br />#defineMR_Reserv3C     0x3C<br />#defineMR_TMODE        0x3D<br />#defineMR_CHKSUM       0x3E<br />#defineMR_VERSION      0x3F<br /><br />//<br />//MR_GAIN register bits<br />//<br />//High 3 bits are voltage (channel 2) gain<br />//Middle two bits are full-scale select for current (channel 1)<br />//Low 3 bits are current (channel 1) gain<br />#defineMR_GAIN_V10X00<br />#defineMR_GAIN_V20X20<br />#defineMR_GAIN_V40X40<br />#defineMR_GAIN_V80X60<br />#defineMR_GAIN_V160X80<br /><br />#defineMR_GAIN_FS_HALF0X00// 0.5V<br />#defineMR_GAIN_FS_QUARTER0X08// 0.25V<br />#defineMR_GAIN_EIGHTH0X10// 0.125V<br /><br />#defineMR_GAIN_I10X00<br />#defineMR_GAIN_I20X01<br />#defineMR_GAIN_I40X02<br />#defineMR_GAIN_I80X03<br />#defineMR_GAIN_I160X04<br /><br /><br />//<br />//MODE register bits<br />//<br />//There are valid combinations of the SWAP and A/D disable functions,<br />//which would not be used during normal operation.<br />//<br />//ADE7763 default at power-up:  0x000C ==&gt;  DISCF + DISSAG<br />//<br />#defineMR_MODE_DISHPF0x0001//High-pass filter HPF1 disabled when set<br />#defineMR_MODE_DISLPF20x0002//Low-pass filter LPF2 disabled when set<br />#defineMR_MODE_DISCF0x0004//CF output disabled when set (default)<br />#defineMR_MODE_DISSAG0x0008///SAG output disabled when set (default)<br />#defineMR_MODE_ASUSPEND0x0010//Suspend (sleep) ADCs when set<br />#defineMR_MODE_TEMPSEL0x0020//Start a temperature conversion when set (&quot;ADCSC&quot;)<br />#defineMR_MODE_SWRST0x0040//Software Chip Reset<br />#defineMR_MODE_CYCMODE0x0080//Line Cycle Energy Accumulation Mode<br />#defineMR_MODE_DISCH10x0100//Short analog inputs, current channel<br />#defineMR_MODE_DISCH20x0200//Short analog inputs, voltage channel<br />#defineMR_MODE_SWAP0x0400//Swap voltage &amp; current channels<br />#defineMR_MODE_DTRT_28K0x0000//Default: 27.9ksps (CLKIN/128)<br />#defineMR_MODE_DTRT_14K0x0800//<br />#defineMR_MODE_DTRT_7K0x1000//<br />#defineMR_MODE_DTRT_3K0x1800//<br />#defineMR_MODE_WAVSEL_ACTIVE0x0000//  Waveform select<br />#defineMR_MODE_WAVSEL_CH10x4000//<br />#defineMR_MODE_WAVSEL_CH20x6000//<br />#defineMR_MODE_POAM0x8000//Positive-power Only Accumulation Mode<br /><br />//<br />// STATUS (&amp; RSTATUS &amp; IRQEN) register bits<br />//<br />//(also used to set the interrupt MASK register.<br />//For the MASK, set the bit if an IRQ should be generated for<br />//the corresponding event.  Only _RESET does not apply.)<br />//<br />#defineMR_STATUS_AEHF0x0001// AENERGY accumulator is half-full<br />#defineMR_STATUS_SAG0x0002// Voltage sag below threshold<br />#defineMR_STATUS_CYCEND0x0004  // End of LINECYC half-line cycles<br />#defineMR_STATUS_WSMP0x0008// Waveform samples data ready<br />#defineMR_STATUS_ZX0x0010// Zero crossing occurred (also ZX output)<br />#defineMR_STATUS_TEMP0x0020// Temperature data ready<br />#defineMR_STATUS_RESET0x0040// End of software/hardware reset<br />#defineMR_STATUS_AEOF0x0080// AENERGY accumulator has overflowed<br />#defineMR_STATUS_PKV0x0100// Peak voltage has been exceeded<br />#defineMR_STATUS_PKI0x0200// Peak current has been exceeded<br />#defineMR_STATUS_VAEHF0x0400// VAENERGY accumulator is half full<br />#defineMR_STATUS_VAEOF0x0800// VAENERGY accumulator has overflowed<br />#defineMR_STATUS_ZXTO0x1000  // Zero crossing time-out occurred<br />#defineMR_STATUS_PPOS0x2000// Power negative to positive<br />#defineMR_STATUS_PNEG0x4000// Power positive to negative<br />#defineMR_STATUS_UNUSED0x8000// Reserved bit<br /><br /><br />void Read_SPI(char addr, unsigned char *data, uint8_t bytes);<br />void Write_SPI(char Address,char DataByte);<br />void spiWrite(char byte);<br />void SpiInit();<br /><br /><br />#endif /* ADE7763_H_ */[/syntax]<br /><br />ade7763.c<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &quot;ade7763.h&quot;<br />#include &quot;SPI/spi.h&quot;<br />#include &quot;UART/UART.h&quot;<br /><br /><br /><br />void SpiInit(){<br />/* Set MOSI, SCK, CS output, all others input */<br />DDRB |= (1&lt;&lt;MOSI)|(1&lt;&lt;SCK)|(1&lt;&lt;CS);<br />CS_H;<br />/* Enable SPI, Master, set clock rate fck/8 */<br />SPCR |= (1&lt;&lt;SPE)|(1&lt;&lt;MSTR)|(1&lt;&lt;SPR0)|(1&lt;&lt;CPHA);<br />SPSR |= (1&lt;&lt;SPI2X);<br /><br />#if DEBUG == 1<br />UART_sendstr(&quot;SPI init done\n\r&quot;);<br />#endif<br />}<br /><br />void spiWrite(char byte)<br />{<br />// Put data to SPI data register<br />SPDR = byte;<br />// Wait until the data are transmitted<br />while(!(SPSR &amp; (1&lt;&lt;SPIF)));<br />}<br /><br />char spiRead()<br />{<br />   // Wait until the data are transmitted<br />   while(!(SPSR &amp; (1&lt;&lt;SPIF)));<br />   return SPDR;<br />}<br /><br /><br />void Write_SPI(char addr,char DataByte)<br />{<br /><br />//adding MSB to the address<br />addr |= 0x80; // 10xx xxxx<br />spiWrite(addr);<br />// Minimum time between the end of data byte transfers.<br />_delay_us(4);<br />spiWrite(DataByte);<br /><br /><br />}<br /><br />void Read_SPI(char addr, unsigned char *data, uint8_t bytes)<br />{<br />spiWrite(addr); // 00xx xxxx<br />_delay_us(4);<br />for(uint8_t i = 0; i &lt; bytes; i++)<br />  {<br />// read one byte<br />  data&#91;i&#93; = spiRead();<br />_delay_us(4); // Minimum time between read command<br />  }<br />#if DEBUG == 1<br />UART_sendstr(&quot;read...\n\r&quot;);<br />UART_sendint(*data);<br />UART_sendstr(&quot;\n\r&quot;);<br />#endif<br /><br />//return SPDR;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7090">Def</a> — 7 lis 2015, o 20:21</p><hr />
]]></content>
</entry>
</feed>