我正在尝试使用I2C在2 16F873之间进行通信。我有线;
以下是主代码和从代码,它们发送“0xFF”数据以将所有B引脚设置为高电平。我将带有220欧姆电阻的LED连接到这些b引脚中的任何一个,但是看不到LED灯。
因此假设我遇到了从站的寻址问题。当我从数据表中读取时,从机的地址是7位,最后一位(位0)表示数据从主机到从机(对于lsb 0)。这就是主人说0x20和从地址是0x10的原因。 (0被添加为LSB)。
我是否必须添加其他寄存器位来设置其他内容?这里有什么问题。
我用PIC C编译器(5.007)编译了所有代码 主码
#include <main.h>
void main()
{
i2c_start();
i2c_write(0x20);//slave address
i2c_write(0xFF);//data
i2c_stop();
while(TRUE)
{
//TODO: User Code
}
}
Main.h(主人)
#include <16F873.h>
#device ADC=16
#FUSES NOWDT //No Watch Dog Timer
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#use delay(crystal=4MHz)
#use i2c(Master,Slow,sda=PIN_C4,scl=PIN_C3)
从属代码
#include <main.h>
#use i2c(Slave,Slow,sda=PIN_C4,scl=PIN_C3,address=0x1d)
#INT_SSP //Interrupt for I2C activity
int8 data;
void sspinterupt()
{
int8 state;
state = i2c_isr_state();
if(state < 0x80) //Master is sending data
{
data = i2c_read(); //An array will be needed to store data if more than one byte is transferred
}
if(state == 0x80) //Master is requesting data
{
i2c_write(data);
}
}
void main()
{
set_tris_b(0x00);
enable_interrupts(INT_SSP);
enable_interrupts(GLOBAL);
while(TRUE)
{
output_b(data); //Output data to port B to visualize
}
}
Main.h(奴隶)
#include <16F873.h>
#device ADC=16
#FUSES NOWDT //No Watch Dog Timer
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#use delay(crystal=4MHz)
Proteus Design