Используя МК mega16 и (в будущем) MAX44007 (датчик освещения) планирую заставить их обмениваться информацией.
Знаю, что есть статья про цифровой люксометр, где все описано, прошу же помочь в "стартовом толчке".
Итак, пока мне нужно заставить обменяться информацией два MK mega16 в простом варианте: ведущий просит у ведомого байт, ведомый передает байт, ведущий зажигает светодиоды на одном из своих портов.
Используя библиотеку Procyon AVRLIB написал две следующих простых программки (дополнительно использую команды в виртуальный терминал для отладки в Proteus)
Master (ведущий)
Код: Выделить всё
#include <avr/io.h>
#include <string.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
#include <stdio.h>
#include <avr/interrupt.h>
#include "\i2c\deps\i2c.h"
#include "\i2c\deps\UART_routines.h"
#define LOCAL_ADDR 0xA0
#define TARGET_ADDR 0x07
unsigned char buf[100];
unsigned char msgbuf[100];
int main(void)
{
uart0_init();
_delay_ms(1000);
sendStr0("*************TWI MASTER RUNNING*************");
// initialize i2c function library
i2cInit();
// set local device address and allow response to general call
i2cSetLocalDeviceAddr(LOCAL_ADDR, TRUE);
unsigned char mBuf[100];
i2cMasterReceive(TARGET_ADDR, strlen(buf), buf);
sprintf(msgbuf,"master received: %s (length %d)",buf,strlen(buf));
transmitString(msgbuf);
TX_NEWLINE;Slave (ведомый)
Код: Выделить всё
#include <avr/io.h>
#include <string.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
#include <stdio.h>
#include <avr/interrupt.h>
#include "\i2c\deps\i2c.h"
#include "\i2c\deps\UART_routines.h"
#define LOCAL_ADDR 0x07
#define TARGET_ADDR 0xA0
unsigned char buf[40];
unsigned char byteToSend;
// slave operations
void i2cSlaveReceiveService(u08 receiveDataLength, u08* receiveData)
{
sprintf(buf,"slave received: %s (length %d)",receiveData,receiveDataLength);
transmitString(buf);TX_NEWLINE;
}
void i2cSlaveSendService(u08 transmitDataLength, u08 byteToSend)
{
byteToSend=0b00111100;
sprintf(buf,"slave sent: %s (length %d)",byteToSend,transmitDataLength);
transmitString(buf);
TX_NEWLINE;
}
int main(void)
{
uart0_init();
//_delay_ms(10);
sendStr0("*************TWI SLAVE RUNNING*************");
// initialize i2c function library
i2cInit();
// set local device address and allow response to general call
i2cSetLocalDeviceAddr(LOCAL_ADDR, TRUE);
i2cSetSlaveReceiveHandler( i2cSlaveReceiveService );
i2cSetSlaveTransmitHandler(i2cSlaveSendService );
while(1)
{
_delay_ms(100);
}
}
Протеус в своих терминалах грустно сообщает, что ведомый передал "нечто" (совпадения бит мне обнаружить не удалось), хотя команды старт и стоп передались нормально. Ведущий же ничего не получил. (длина 0)
Судя по всему, я просто где-то что-то не понимаю, потому что, к примеру, у мастера процедура i2cMasterReceive(TARGET_ADDR, strlen(buf), buf); не имеет возвращаемого значения, а записывает результат (как я понимаю) в buf.
Собственно, пока прошу помочь исправить программу так, чтобы она выполняла сей несложный алгоритм
Спасибо