SPI på PIC16F628A med USART
Postat: 25 april 2010, 15:22:25
Jag sitter med en 628a och försöker att få den att prata SPI med USART-modulen. Följande kod använder jag till mitt test:
Koden i sig fungerar, jag ser 11001100 på oscilloskopet, men kruxet är att en 1a ter sig som 0V och en 0a som 5V. När ingenting skickas är RB2 (DT) hög. Klockpinnen, RB1 (CK), beter sig som väntat.
I tidigare projekt har jag bit-bangat SPI, och då har jag kört allting lågt (0V) om inget är aktivt, och mina SPI-enheter har fungerat utan problem. I detta test har jag inte använt en extern SPI-enhet som tar emot datan från 628an, utan jag har bara läst av CK/DT med oscilloskop eftersom jag aldrig använt USART-modulen förut och ville bara undersöka hur den beter sig.
I 628ans datablad står det att om jag vill avbryta en sändning så ska jag sätta TXEN till 0, och då kommer DT/CK att sättas till high impedance. Nu vill jag ju inte avbryta något men jag vet inte vad det innebär att pinnarna sätts till high-Z, men det är den enda ledtråd jag kan hitta.
Min fråga, slutligen, lyder: Hur gör jag för att på DT-pinnen se en 1a som +5V och en 0a som 0V på oscilloskopet? Har jag konfiguerat USART-modulen fel eller har jag missat något annat?
(Fotnot: Hårdvaran för detta test består av en 628:a med WISP inkopplad. Inga övriga komponenter än ett motstånd på MCLR-pinnen och en konding över Vdd/Vss)
Kod: Markera allt
#include <htc.h>
void main(void) {
int foo;
OSCF = 0; // 4MHz INTOSC
TRISA = TRISB = PORTA = PORTB = 0;
SPBRG = 103; // 9615 bps
TXIE = GIE = 0;
TXSTA = 0;
CSRC = 1; // Master mode
SYNC = 1; // Synchronous
RCSTA = 0;
SPEN = 1; // Serial Port Enable
TXEN = 1;
while (1) {
TXREG = 0b11001100;
// some delay
for (foo = 0; foo < 15000; foo++) {}
}
}
I tidigare projekt har jag bit-bangat SPI, och då har jag kört allting lågt (0V) om inget är aktivt, och mina SPI-enheter har fungerat utan problem. I detta test har jag inte använt en extern SPI-enhet som tar emot datan från 628an, utan jag har bara läst av CK/DT med oscilloskop eftersom jag aldrig använt USART-modulen förut och ville bara undersöka hur den beter sig.
I 628ans datablad står det att om jag vill avbryta en sändning så ska jag sätta TXEN till 0, och då kommer DT/CK att sättas till high impedance. Nu vill jag ju inte avbryta något men jag vet inte vad det innebär att pinnarna sätts till high-Z, men det är den enda ledtråd jag kan hitta.
Min fråga, slutligen, lyder: Hur gör jag för att på DT-pinnen se en 1a som +5V och en 0a som 0V på oscilloskopet? Har jag konfiguerat USART-modulen fel eller har jag missat något annat?
(Fotnot: Hårdvaran för detta test består av en 628:a med WISP inkopplad. Inga övriga komponenter än ett motstånd på MCLR-pinnen och en konding över Vdd/Vss)