SPI iletişim ve Arduino kodundaki karşıklık

Başlatan dyonizos, 31 Mayıs 2016, 12:11:24

dyonizos

selam arkadaşlar,
elimde bir modül var ve SPI ile haberleşiyor. Daha önce hiç SPI ile haberleşme denemem olmadı. SW yada HW bir şekilde haberleşme kısmını halledebileceğimi sanıyorum ama modüldeki haberleşme mantığını çözemedim.
Arduino ile yapılmış bir kod var nette bulunan. Bu kodda CLK, DATA ve EN pinlerini manuel olarak low ve high olarak kullanmışlar neden bilmiyorum.
Ancak bu kodlarda nasıl bir data gönderildiğini çözemedim.
Kullandığım modülün datasheeti ile arduino kodunu karşılaştırıp şu şekilde göndermişler yada şu şekilde göndermelisin diyebilecek kimse var mı acaba?
Gönderilen hex datalar bunlar ama bunları farklı bir şekilde göndermişler. Arduino ile karşılaştırıp yada hiç karşılaştırmadan fikir verme şansınız var mı?

0x2A05,    0x299B,    0x2991,    0x2987,    0x291D,    0x2913,    0x2909,    0x289F,    // Band A
0x2903,    0x290C,    0x2916,    0x291F,    0x2989,    0x2992,    0x299C,    0x2A05,    // Band B
0x2895,    0x288B,    0x2881,    0x2817,    0x2A0F,    0x2A19,    0x2A83,    0x2A8D,    // Band E
0x2906,    0x2910,    0x291A,    0x2984,    0x298E,    0x2998,    0x2A02,    0x2A0C,  // Band F / Airwave
0x281D,    0x2890,    0x2902,    0x2915,    0x2987,    0x299A,    0x2A0C,    0x2A1F  //Race Band

bu hex dataları sadece SHout ile göndermek yeterli olur mu? çünkü modül 25 bit diyor bu datalar 16 bit. Kalan 4 bitin nasıl gönderilmesi gerekiyor.
Benim anladığım ilk olarak adres gonderiliyor 5 bit
ilk gonderimde      00010 ardında da 20bit 0 gonderilmiş gibi
ikinci bolumde de  10001 gonderılıyor. sonrasında da 16bit kanal datası ve 4 bit 0 gibi
yani ilk data
Register A için 00010 0000 0000 0000 0000 0000
Register B içinde  10001 0x2a5 0000

Bu durumda bu şekilde bir kod yazılımı iş görür mü?

SHOut DATA, SCLK, MsbFirst_H, [%0001000000000000000000000\25 ]
SHOut DATA, SCLK, MsbFirst_H, [%00010\5,0x2a5 \ 16,%0000\4 ]




ARDUINO KODU
#include <TVout.h>
#include <fontALL.h>
#include <avr/pgmspace.h>
#include <EEPROM.h>

#define spiDataPin 10
#define slaveSelectPin 11
#define spiClockPin 12
................

// Channels to sent to the SPI registers
const uint16_t channelTable[] PROGMEM =
{
	// Channel 1 - 8
	0x2A05,    0x299B,    0x2991,    0x2987,    0x291D,    0x2913,    0x2909,    0x289F,    // Band A
	0x2903,    0x290C,    0x2916,    0x291F,    0x2989,    0x2992,    0x299C,    0x2A05,    // Band B
	0x2895,    0x288B,    0x2881,    0x2817,    0x2A0F,    0x2A19,    0x2A83,    0x2A8D,    // Band E
	0x2906,    0x2910,    0x291A,    0x2984,    0x298E,    0x2998,    0x2A02,    0x2A0C,  // Band F / Airwave
	0x281D,    0x2890,    0x2902,    0x2915,    0x2987,    0x299A,    0x2A0C,    0x2A1F  //Race Band

};

// Channels with their Mhz Values
const uint16_t channelFreqTable[] PROGMEM =
{
	// Channel 1 - 8
	5865, 5845, 5825, 5805, 5785, 5765, 5745, 5725, // Band A
	5733, 5752, 5771, 5790, 5809, 5828, 5847, 5866, // Band B
	5705, 5685, 5665, 5645, 5885, 5905, 5925, 5945, // Band E
	5740, 5760, 5780, 5800, 5820, 5840, 5860, 5880, // Band F / Airwave
	5658, 5695, 5732, 5769, 5806, 5843, 5880, 5917  //Race Band
};

.
.
.aradaki alakasız kodları sildim...
.
.
.

void setChannelModule(uint8_t channel)
{
	uint8_t i;
	uint16_t channelData;

	//channelData = pgm_read_word(&channelTable[channel]);
	//channelData = channelTable[channel];
	channelData = pgm_read_word_near(channelTable + channel);

	// bit bash out 25 bits of data
	// Order: A0-3, !R/W, D0-D19
	// A0=0, A1=0, A2=0, A3=1, RW=0, D0-19=0
	SERIAL_ENABLE_HIGH();
	delayMicroseconds(1);
	//delay(2);
	SERIAL_ENABLE_LOW();

	SERIAL_SENDBIT0();
	SERIAL_SENDBIT0();
	SERIAL_SENDBIT0();
	SERIAL_SENDBIT1();

	SERIAL_SENDBIT0();

	// remaining zeros
	for (i = 20; i > 0; i--)
		SERIAL_SENDBIT0();

	// Clock the data in
	SERIAL_ENABLE_HIGH();
	//delay(2);
	delayMicroseconds(1);
	SERIAL_ENABLE_LOW();

	// Second is the channel data from the lookup table
	// 20 bytes of register data are sent, but the MSB 4 bits are zeros
	// register address = 0x1, write, data0-15=channelData data15-19=0x0
	SERIAL_ENABLE_HIGH();
	SERIAL_ENABLE_LOW();

	// Register 0x1
	SERIAL_SENDBIT1();
	SERIAL_SENDBIT0();
	SERIAL_SENDBIT0();
	SERIAL_SENDBIT0();

	// Write to register
	SERIAL_SENDBIT1();

	// D0-D15
	//   note: loop runs backwards as more efficent on AVR
	for (i = 16; i > 0; i--)
	{
		// Is bit high or low?
		if (channelData & 0x1)
		{
			SERIAL_SENDBIT1();
		}
		else
		{
			SERIAL_SENDBIT0();
		}

		// Shift bits along to check the next one
		channelData >>= 1;
	}

	// Remaining D16-D19
	for (i = 4; i > 0; i--)
		SERIAL_SENDBIT0();

	// Finished clocking data in
	SERIAL_ENABLE_HIGH();
	delayMicroseconds(1);
	//delay(2);

	digitalWrite(slaveSelectPin, LOW);
	digitalWrite(spiClockPin, LOW);
	digitalWrite(spiDataPin, LOW);
}


void SERIAL_SENDBIT1()
{
	digitalWrite(spiClockPin, LOW);
	delayMicroseconds(1);

	digitalWrite(spiDataPin, HIGH);
	delayMicroseconds(1);
	digitalWrite(spiClockPin, HIGH);
	delayMicroseconds(1);

	digitalWrite(spiClockPin, LOW);
	delayMicroseconds(1);
}

void SERIAL_SENDBIT0()
{
	digitalWrite(spiClockPin, LOW);
	delayMicroseconds(1);

	digitalWrite(spiDataPin, LOW);
	delayMicroseconds(1);
	digitalWrite(spiClockPin, HIGH);
	delayMicroseconds(1);

	digitalWrite(spiClockPin, LOW);
	delayMicroseconds(1);
}

void SERIAL_ENABLE_LOW()
{
	delayMicroseconds(1);
	digitalWrite(slaveSelectPin, LOW);
	delayMicroseconds(1);
}

void SERIAL_ENABLE_HIGH()
{
	delayMicroseconds(1);
	digitalWrite(slaveSelectPin, HIGH);
	delayMicroseconds(1);
}


Dahasheet görüntüsü