Приветствую Не удается подружить аппаратный 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){} }
|