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;
}