קוד:
class SPI
{
private:
unsigned char MOSI,
MISO,
SCK,
CS;
void CS_Enable()
{
digitalWrite(this->CS, HIGH);
}
void CS_Disable()
{
digitalWrite(this->CS, LOW);
}
public:
SPI(unsigned char MOSI, unsigned char MISO, unsigned char SCK, unsigned char CS)
{
this->MOSI = MOSI;
this->MISO = MISO;
this->SCK = SCK;
this->CS = CS;
pinMode(MOSI, OUTPUT);
pinMode(MISO, INPUT);
pinMode(SCK, OUTPUT);
pinMode(CS, OUTPUT);
}
void sendData(unsigned data)
{
unsigned char MSB = 0x80; /*Send data from MSB to LSB. 0x80 = 10000000b. */
unsigned char i = 0; /*Loops. */
CS_Disable(); /*Activates the slave. When CS is low, the slave work. */
for (i = 0; i < 8; ++i)
{
if ((data & 0x80) == 0x80)
{
digitalWrite(this->MOSI, HIGH);
}
else
{
digitalWrite(this->MOSI, LOW);
}
/*Send a clock pulse.*/
digitalWrite(this->SCK, HIGH);
digitalWrite(this->SCK, LOW);
data = data << 1;
}
CS_Enable(); /*Turns off the slave. */
}
unsigned char receiveData()
{
unsigned char MSB = 0x80; /*Receive data from MSB to LSB. 0x80 = 10000000b. */
unsigned char data = 0;
unsigned char i = 0; /*Loops. */
CS_Disable(); /*Activates the slave. When CS is low, the slave work. */
for (i = 0; i < 8; ++i)
{
/*Clock signal start. */
digitalWrite(this->SCK, HIGH);
if (digitalRead(this->MISO) == HIGH)
{
data += MSB;
}
MSB = MSB >> 1;
/*Clock signal end. */
digitalWrite(this->SCK, LOW);
}
CS_Enable(); /*Turns off the slave. */
return data;
}
};
SPI tmp(2, 5, 4, 3);
void setup()
{
Serial.begin(9600);
}
void loop()
{
tmp.sendData(0x40);
Serial.println(tmp.receiveData());
}