вообщем так - я научился передавть 1 байт, а вот с передачей пакета из нескольких пока проблемы. Передеача одного байта с АЦП и выдача его на rs232 у меня осуществяляется вот так:
#include <Nordic\reg24e1.h>
struct RFConfig { unsigned char n; unsigned char buf[15]; };
typedef struct RFConfig RFConfig;
#define ADDR_INDEX 8 // Index to address bytes in RFConfig.buf #define ADDR_COUNT 4 // Number of address bytes
const RFConfig txconf = { 15, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x34, 0x56, 0x78, 0x83, 0x6c, 0x04 };
const RFConfig rxconf = { 15, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x65, 0x43, 0x21, 0x83, 0x6c, 0x05 };
void Delay100us(volatile unsigned char n) { unsigned char i; while(n--) for(i=0;i<35;i++) ; }
unsigned char SpiReadWrite(unsigned char B) { EXIF &= ~0x20; // Clear SPI interrupt SPI_DATA = b; // Move byte to send to SPI data register while((EXIF & 0x20) == 0x00) // Wait until SPI hs finished transmitting ; return SPI_DATA; }
void InitUart(void) { TH1 = 243;// 19200@16MHz (when T1M=1 and SMOD=1) CKCON |= 0x10; // T1M=1 (/4 timer clock) PCON = 0x80; // SMOD=1 (double baud rate) SCON = 0x52; // Serial mode1, enable receiver TMOD = 0x20; // Timer1 8bit auto reload TR1 = 1; // Start timer1 P0_DIR |= 0x02; // P0.1 (RxD) is an input P0_ALT |= 0x06; // Select alternate functions on pins P0.1 and P0.2 }
void PutChar(char B) { while(!TI) ; TI = 0; SBUF = b; }
void InitADC(void) { ADCCON = 0x20; // Channel 0, NPD=1, ADCRUN=0, EXTREF=0 ADCSTATIC &= 0x1c; ADCSTATIC |= 0x03; // 12bit ADCCON &= ~0x80; // Start.. ADCCON |= 0x80; // ..new conversion } /* void InitPWM(void) { P0_ALT |= 0x80; // Enable PWM output PWMCON = 0xc0; // Enable 8 bit PWM with minimum prescaler } */
unsigned char ReceivePacket() { unsigned char b; CE = 1; while(DR1 == 0) ; b = SpiReadWrite(0); CE = 0; return b; }
void TransmitPacket(unsigned char B) { unsigned char i; CE = 1; Delay100us(0); // Start with the address of the receiver: for(i=0;i<ADDR_COUNT;i++) SpiReadWrite(rxconf.buf[ADDR_INDEX+i]); SpiReadWrite(B); CE = 0; Delay100us(3); // Wait ~300us }
unsigned char ReadADC(void) { unsigned char b;
while((EXIF & 0x10) == 0) // Wait until ADC conversion complete ; EXIF &= ~0x10; // Clear ADC completion bit b = ADCDATAH; // Read ADC data ADCCON &= ~0x80; // Start.. ADCCON |= 0x80; // ..new conversion return b; }
/*void WritePWM(unsigned char B) { PWMDUTY = b; } */ void Receiver(void) { unsigned char b; CS = 1; Delay100us(0); for(b=0;b<rxconf.n;b++) { SpiReadWrite(rxconf.buf[b]); } CS = 0; for(;;) { b = ReceivePacket(); PutChar(B); } }
void Transmitter(void) { unsigned char b; CS = 1; Delay100us(0); for(b=0;b<txconf.n;b++) { SpiReadWrite(txconf.buf[b]); } CS = 0; for(;;) { b = ReadADC(); // Read ADC TransmitPacket(B); // Transmit data } }
void Init(void) { P0_DIR = 0x40; // P0.6 is input, the rest output P0 = 0x10; // P0.4 = 1 for the rec/tran selection PWR_UP = 1; // Turn on Radio Delay100us(30); // Wait > 3ms SPICLK = 0; // Max SPI clock (XTAL/8) SPI_CTRL = 0x02; // Connect internal SPI controller to Radio }
void main(void) { Init(); if(P0 & 0x40) { InitUart(); Receiver(); } else { InitADC(); Transmitter(); } }
Это написано на си под 8051. Прога рабочая - выдает на 232 интерфейс последовательность байт, которые соответствуют значению напряжения на АЦП передатчика. Вопрос в другом - я изменил значение DATA_1W в конфигурации, но пакет из нескольких байт не хочет передаваться - то есть приемник его не принимает (не знаю, передает ли передатчик еще не проверял) Если решишь эту пробелму - пиши. Если решу сам - напишу :-))
Сообщение отредактировал Михаил Горюнов - Jun 8 2006, 08:53
--------------------
Это не то что вы подумали ...
|