2020-12-21

JHM1203+IIC接口+主控芯片(nRF24LE1)的使用(软件模拟)

1.根据需要分析可知:nRF24LE1为主机,JHM1203为从机,则二者应为nRF24LE1从JHM1203读取数据,即可定位至JHM1203手册中图6-4。

2.根据电路图配置管脚

主要配置nRF24LE1的P12为SDA,P11为SCL,代码为

#define     SDA  P12
#define     SCL  P11

初始化管脚方向:SCL为输出方向;SDA初始设置为输出方向,根据时序图,SDA有时输入有时输出,则对其输入和输出分别定义。代码为:

//I2C
#define     SDA_IN()   P1DIR = 0x7D
#define     SDA_OUT()   P1DIR = 0x79

void io_init(void)
{	
    //    // Pin directions, Output: dir=0, Input: dir=1.
    //    P0.3 TXD P0.4 RXD
    //    // P0.7-P0.0: I I I I O I O O = 0xF4
    //    // P1.6-P1.0: x I I I I I I I = 0x7F
    #ifdef USE_UART
	    P0DIR = 0xf4;     // using UART P0.3,P0.4
    #else
	    P0DIR = 0xfC;     // 
    #endif
    //	P1DIR = 0x7F;     
	    P1DIR = 0x79;//初始状态设置为SCL为输出,SDA为输出
	    SDA = 1;//初始状态为高电平
	    SCL = 1;//初始状态为高电平
}

3.根据时序图写模拟代码

(1)先写好起始信号、停止信号、应答信号、非应答信号以及等待应答信号

//产生IIC开始信号
void  IIC_Start(void){
		SDA_OUT();//SDA线输出
		SDA = 1;
		SCL = 1;
		delay_us(4);
		SDA = 0;
		delay_us(4);
	    SCL = 0;//钳住IIC总线,准备发送或接收数据
}

//产生IIC停止信号
void  IIC_Stop(void){
		SDA_OUT();//SDA线输出
		SCL = 0;
		SDA = 0;
		delay_us(4);
		SCL = 1;
		SDA = 1;
		delay_us(4);
}

//等待应答信号到来,返回值为1表示接收应答失败,为0表示接收应答成功
uint8_t IIC_Wait_ACK(void){
		uint8_t ucErrTime = 0;
		SDA_IN();
		SDA = 1;delay_us(1);
		SCL = 1;delay_us(1);
		while(SDA)
		{
			ucErrTime++;
			if(ucErrTime>250)
			{
				IIC_Stop();
				return 1;
			}
		}
		SCL = 0;//时钟输出为0
		return 0;
}

//产生ACK应答
void IIC_ACK(void){
		SCL = 0;
		SDA_OUT();
		SDA = 0;
		delay_us(2);
		SCL = 1;
		delay_us(2);
		SCL = 0;
}

//不产生ACK应答
void IIC_NACK(void){
		SCL = 0;
		SDA_OUT();
		SDA = 1;
		delay_us(2);
		SCL = 1;
		delay_us(2);
		SCL = 0;
}

(2)写发送函数、读取函数、整个时序图函数以及连续读取函数

void IIC_Send_Byte(uint8_t txd){
		uint8_t t;
		SDA_OUT();
		SCL = 0;//拉低时钟时开始数据传输
		for(t=0;t<8;t++)
		{
				if((txd&0x80)>>7)
						SDA = 1;
				else
						SDA = 0;
				txd<<=1;
				delay_us(2);
				SCL = 1;
				delay_us(2);
				SCL = 0;
				delay_us(2);
		}
}

uint8_t IIC_Read_Byte(unsigned char ack){
	unsigned char i,receive = 0;
	SDA_IN();
		SCL = 0;//拉低时钟时开始数据传输
		for(i=0;i<8;i++)
		{
				SCL = 0;
				delay_us(2);
				SCL = 1;
				receive<<=1;
				if(SDA) receive++;
				delay_us(1);
		}
		if(!ack)
				IIC_NACK();//发送NACK
		else
				IIC_ACK();//发送ACK
		return receive;
}

uint8_t JHM1203_ReadOneByte(){
	uint8_t temp = 0;
	IIC_Start();
  IIC_Send_Byte(0xF1);//发送器件地址0xA0,写数据
		IIC_Wait_ACK();
		if(IIC_Read_Byte(IIC_Wait_ACK()) == 0X40)
		{
				IIC_Wait_ACK();
        RawDat[0] = IIC_Read_Byte(IIC_Wait_ACK());
			  IIC_Wait_ACK();
			  RawDat[1] = IIC_Read_Byte(IIC_Wait_ACK());
			  IIC_Wait_ACK();
			  RawDat[2] = IIC_Read_Byte(IIC_Wait_ACK());
				IIC_NACK();//发送NACK
				IIC_Stop();//产生一个停止条件
				return RawDat[3];
		}
		return 0;
}

uint8_t  JHM1203_Read(uint8_t *pBuffer,uint16_t NumToRead){
		while(NumToRead)
		{
				*pBuffer++=JHM1203_ReadOneByte();
				NumToRead--;
		}
		return *pBuffer;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值