Приветствую
Не удается подружить аппаратный SPI C8051F410 с CP2120.
Попробовал программно сделать (закомментировано в тексте) все работает отлично.
Пробовал менять фазы и др. настройки для SPI - ничего не дает. SPI работает (на осциллографе посмотрел выход SCK и MOSI), времянки правильные. Но увидеть фазу посылки на осцилле не получается, он без памяти.
Предполагаю,что не верные фазы или направление передачи (нужно MSB first).
#include "C8051F410.h"
sbit SCK = P1^1; // SPI clock pin
sbit MISO = P1^3; // SPI data input
sbit MOSI = P1^4; // SPI data output
sbit CPCS = P1^5; // CP2120 chip select active low
char r=0, p=0;
void SPI_Init()
{
SPI0CFG = 0x70;
SPI0CKR = 0x79;
SPI0CN = 0x0D;
SPIEN = 1;
}
void Port_IO_Init()
{
// P1.1 - SCK (SPI0), Push-Pull, Digital
// P1.3 - MISO (SPI0), Push-Pull, Digital
// P1.4 - MOSI (SPI0), Push-Pull, Digital
// P1.5 - NSS (SPI0), Push-Pull, Digital
P0MDIN = 0xFE;
P1MDIN = 0xFB;
P2MDIN = 0x03;
P1MDOUT = 0x7B;
P2MDOUT = 0x03;
P0SKIP = 0xCF;
P1SKIP = 0xC5;
P2SKIP = 0xFF;
XBR0 = 0x03;
XBR1 = 0x40;
P0MASK = 0x4E;
// инициализация для программного SPI
/*
P0MDIN = 0xFE; //hard SPI
P1MDIN = 0xFB;
P2MDIN = 0x03;
P1MDOUT = 0x7B;
P2MDOUT = 0x03;
P0SKIP = 0xCF;
P1SKIP = 0x05;
XBR0 = 0x01;
XBR1 = 0x40;
P0MASK = 0x4E;
*/
P0 = 0xFF;
P1 = 0xFF;
P2 = 0xFF;
}
void Oscillator_Init()
{
OSCICN = 0x87; // при программном сбрасывал до 0x83
}
void Init_Device(void)
{
// disable watchdog timer
PCA0MD &= ~0x40; // WDTE = 0 (clear watchdog timer enable)
Port_IO_Init();
Oscillator_Init();
SPI_Init();
}
void small_delay(char ms) //xtal 50MHz ms=1->185nsec
{
while (ms--);
}
// Программный SPI, рабочий
/*void Send_SPI(char byte3) // MSB first
{
char tmp;
for (tmp = 0; tmp < 8; tmp ++)
{
if (byte3 & 0x80) MOSI = 1;
else MOSI = 0;
SCK=0;
SCK=1;
byte3 <<= 1;
}
}
*/
void main (void)
{
Init_Device();
//Рабочий кусок с вызовом программного SPI обращение к CP2120
/* CPCS = 0;
Send_SPI(0x18); // выбор направления приема/передачи данных MSB first
Send_SPI(0x81);
Send_SPI(0x20); // настройка портов
Send_SPI(0x00);
Send_SPI(0xAA);
Send_SPI(0x20); // настройка портов
Send_SPI(0x07);
Send_SPI(0xAA);
Send_SPI(0x20); // инициалзация портов
Send_SPI(0x01);
Send_SPI(0x48);
CPCS = 1;
*/
NSSMD0 = 0;
small_delay(20);
SPI0DAT = 0x18;
while (TXBMT != 1){}
SPI0DAT = 0x81;
while (TXBMT != 1){}
SPI0DAT = 0x20;
while (TXBMT != 1){ }
SPI0DAT = 0x00;
while (TXBMT != 1){}
SPI0DAT = 0xAA;
while (TXBMT != 1){}
SPI0DAT = 0x20;
while (TXBMT != 1){ }
SPI0DAT = 0x07;
while (TXBMT != 1){ }
SPI0DAT = 0xAA;
while (TXBMT != 1){ }
SPI0DAT = 0x20;
while (TXBMT != 1){ }
SPI0DAT = 0x01;
while (TXBMT != 1){}
SPI0DAT = 0x48;
while (TXBMT != 1){}
SPIF = 0;
while (SPIF != 1){}
SPIF = 0;
small_delay(20);
NSSMD0 = 1;
while(1){}
}