在线时间587 小时
UID3253488
注册时间2016-3-21
NXP金币0

TA的每日心情 | 怒 2017-1-4 08:05 |
---|
签到天数: 11 天 连续签到: 1 天 [LV.3]偶尔看看II
版主
  
- 积分
- 2569

- 最后登录
- 2019-3-28
|
发表于 2017-6-30 15:01:10
|
显示全部楼层
- #include "ioiic.h"
- static void delay_us(uint16_t xus)
- {
- uint16_t i,j;
- for(i=xus;i>0;i--)
- for(j=16;j>0;j--)
- __asm("NOP");
- }
- static void delay_ms(uint16_t xms)
- {
- uint16_t i,j;
- for(i=xms;i>0;i--)
- for(j=19999;j>0;j--)
- __asm("NOP");
- }
- static void SDA0_OUT()
- {
- gpio_pin_config_t sda_config = {kGPIO_DigitalOutput, 1};
-
- CLOCK_EnableClock (IIC0_SDA_CLOCK);
-
- PORT_SetPinMux (IIC0_SDA_PORT,IIC0_SDA_PIN,kPORT_MuxAsGpio);//I2C0_SDA
- GPIO_PinInit(IIC0_SDA_GPIO,IIC0_SDA_PIN,&sda_config);
-
- }
- static void SDA0_IN()
- {
- gpio_pin_config_t sda_config = {kGPIO_DigitalInput, 1};
-
- CLOCK_EnableClock (IIC0_SDA_CLOCK);
-
- PORT_SetPinMux (IIC0_SDA_PORT,IIC0_SDA_PIN,kPORT_MuxAsGpio);//I2C0_SDA
- GPIO_PinInit(IIC0_SDA_GPIO,IIC0_SDA_PIN,&sda_config);
- }
- #if 0
- static void SDA1_OUT()
- {
- gpio_pin_config_t sda_config = {kGPIO_DigitalOutput, 1};
-
- CLOCK_EnableClock (IIC1_SDA_CLOCK);
-
- PORT_SetPinMux (IIC1_SDA_PORT,IIC1_SDA_PIN,kPORT_MuxAsGpio);//I2C0_SDA
- GPIO_PinInit(IIC1_SDA_GPIO,IIC1_SDA_PIN,&sda_config);
-
- }
- static void SDA1_IN()
- {
- gpio_pin_config_t sda_config = {kGPIO_DigitalInput, 1};
-
- CLOCK_EnableClock (IIC1_SDA_CLOCK);
-
- PORT_SetPinMux (IIC1_SDA_PORT,IIC1_SDA_PIN,kPORT_MuxAsGpio);//I2C0_SDA
- GPIO_PinInit(IIC1_SDA_GPIO,IIC1_SDA_PIN,&sda_config);
- }
- #endif
- void IIC0_Config(void)
- {
- gpio_pin_config_t scl_config = {kGPIO_DigitalOutput, 1};
-
- CLOCK_EnableClock (IIC0_SCL_CLOCK);
-
- PORT_SetPinMux (IIC0_SCL_PORT,IIC0_SCL_PIN,kPORT_MuxAsGpio);//I2C0_SCL
- GPIO_PinInit(IIC0_SCL_GPIO,IIC0_SCL_PIN,&scl_config);
- }
- #if 0
- void IIC1_Config(void)
- {
- gpio_pin_config_t scl_config = {kGPIO_DigitalOutput, 1};
-
- CLOCK_EnableClock (IIC1_SCL_CLOCK);
-
- PORT_SetPinMux (IIC1_SCL_PORT,IIC1_SCL_PIN,kPORT_MuxAsGpio);//I2C1_SCL
- GPIO_PinInit(IIC1_SCL_GPIO,IIC1_SCL_PIN,&scl_config);
- }
- #endif
- void IIC0_Start(void)
- {
- SDA0_OUT(); //sda线输出
- IIC0_SDA_H;//IIC_SDA=1;
- IIC0_SCL_H;//IIC_SCL=1;
- delay_us(4);
- IIC0_SDA_L;//IIC_SDA=0;//START:when CLK is high,DATA change form high to low
- delay_us(4);
- IIC0_SCL_L;//IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
- }
- //产生IIC停止信号
- void IIC0_Stop(void)
- {
- SDA0_OUT();//sda线输出
- IIC0_SCL_L;//IIC_SCL=0;
- IIC0_SDA_L;//IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
- delay_us(4);
- IIC0_SCL_H;//IIC_SCL=1;
- IIC0_SDA_H;//IIC_SDA=1;//发送I2C总线结束信号
- delay_us(4);
- }
- //等待应答信号到来
- //返回值:1,接收应答失败
- // 0,接收应答成功
- uint8_t IIC0_Wait_Ack(void)
- {
- uint8_t ucErrTime=0;
- SDA0_IN(); //SDA设置为输入
- IIC0_SDA_H;//IIC_SDA=1;
- delay_us(1);
- IIC0_SCL_H;//IIC_SCL=1;
- delay_us(1);
- while(IIC0_SDA)
- {
- ucErrTime++;
- if(ucErrTime>250)
- {
- IIC0_Stop();
- return 1;
- }
- }
- IIC0_SCL_L;//IIC_SCL=0;//时钟输出0
- return 0;
- }
- //产生ACK应答
- void IIC0_Ack(void)
- {
- IIC0_SCL_L;//IIC_SCL=0;
- SDA0_OUT();
- IIC0_SDA_L;//IIC_SDA=0;
- delay_us(2);
- IIC0_SCL_H;//IIC_SCL=1;
- delay_us(2);
- IIC0_SCL_L;//IIC_SCL=0;
- }
- //不产生ACK应答
- void IIC0_NAck(void)
- {
- IIC0_SCL_L;//IIC_SCL=0;
- SDA0_OUT();
- IIC0_SDA_H;//IIC_SDA=1;
- delay_us(2);
- IIC0_SCL_H;//IIC_SCL=1;
- delay_us(2);
- IIC0_SCL_L;//IIC_SCL=0;
- }
- //IIC发送一个字节
- //返回从机有无应答
- //
- //0,无应答
- void IIC0_Send_Byte(uint8_t txd)
- {
- uint8_t t;
- SDA0_OUT();
- IIC0_SCL_L;//IIC_SCL=0;//拉低时钟开始数据传输
- for(t=0;t<8;t++)
- {
- //IIC_SDA=(txd&0x80)>>7;
- if((txd&0x80)>>7)
- IIC0_SDA_H;//IIC_SDA=1;
- else
- IIC0_SDA_L;//IIC_SDA=0;
- txd<<=1;
- delay_us(2); //对TEA5767这三个延时都是必须的
- IIC0_SCL_H;//IIC_SCL=1;
- delay_us(2);
- IIC0_SCL_L;//IIC_SCL=0;
- delay_us(2);
- }
- }
- //读1个字节,ack=1时,发送ACK,ack=0,发送nACK
- uint8_t IIC0_Read_Byte(unsigned char ack)
- {
- unsigned char i,receive=0;
- SDA0_IN();//SDA设置为输入
- for(i=0;i<8;i++ )
- {
- IIC0_SCL_L;//IIC_SCL=0;
- delay_us(2);
- IIC0_SCL_H;//IIC_SCL=1;
- receive<<=1;
- if(IIC0_SDA)receive++;
- delay_us(1);
- }
- if (!ack)
- IIC0_NAck();//发送nACK
- else
- IIC0_Ack(); //发送ACK
- return receive;
- }
- #if 0
- void IIC1_Start(void)
- {
- SDA1_OUT(); //sda线输出
- IIC1_SDA_H;//IIC_SDA=1;
- IIC1_SCL_H;//IIC_SCL=1;
- delay_us(4);
- IIC1_SDA_L;//IIC_SDA=0;//START:when CLK is high,DATA change form high to low
- delay_us(4);
- IIC1_SCL_L;//IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
- }
- //产生IIC停止信号
- void IIC1_Stop(void)
- {
- SDA1_OUT();//sda线输出
- IIC1_SCL_L;//IIC_SCL=0;
- IIC1_SDA_L;//IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
- delay_us(4);
- IIC1_SCL_H;//IIC_SCL=1;
- IIC1_SDA_H;//IIC_SDA=1;//发送I2C总线结束信号
- delay_us(4);
- }
- //等待应答信号到来
- //返回值:1,接收应答失败
- // 0,接收应答成功
- uint8_t IIC1_Wait_Ack(void)
- {
- uint8_t ucErrTime=0;
- SDA1_IN(); //SDA设置为输入
- IIC1_SDA_H;//IIC_SDA=1;
- delay_us(1);
- IIC1_SCL_H;//IIC_SCL=1;
- delay_us(1);
- while(IIC1_SDA)
- {
- ucErrTime++;
- if(ucErrTime>250)
- {
- IIC1_Stop();
- return 1;
- }
- }
- IIC1_SCL_L;//IIC_SCL=0;//时钟输出0
- return 0;
- }
- //产生ACK应答
- void IIC1_Ack(void)
- {
- IIC1_SCL_L;//IIC_SCL=0;
- SDA1_OUT();
- IIC1_SDA_L;//IIC_SDA=0;
- delay_us(2);
- IIC1_SCL_H;//IIC_SCL=1;
- delay_us(2);
- IIC1_SCL_L;//IIC_SCL=0;
- }
- //不产生ACK应答
- void IIC1_NAck(void)
- {
- IIC1_SCL_L;//IIC_SCL=0;
- SDA1_OUT();
- IIC1_SDA_H;//IIC_SDA=1;
- delay_us(2);
- IIC1_SCL_H;//IIC_SCL=1;
- delay_us(2);
- IIC1_SCL_L;//IIC_SCL=0;
- }
- //IIC发送一个字节
- //返回从机有无应答
- //
- //0,无应答
- void IIC1_Send_Byte(uint8_t txd)
- {
- uint8_t t;
- SDA1_OUT();
- IIC1_SCL_L;//IIC_SCL=0;//拉低时钟开始数据传输
- for(t=0;t<8;t++)
- {
- //IIC_SDA=(txd&0x80)>>7;
- if((txd&0x80)>>7)
- IIC1_SDA_H;//IIC_SDA=1;
- else
- IIC1_SDA_L;//IIC_SDA=0;
- txd<<=1;
- delay_us(2); //对TEA5767这三个延时都是必须的
- IIC1_SCL_H;//IIC_SCL=1;
- delay_us(2);
- IIC1_SCL_L;//IIC_SCL=0;
- delay_us(2);
- }
- }
- //读1个字节,ack=1时,发送ACK,ack=0,发送nACK
- uint8_t IIC1_Read_Byte(unsigned char ack)
- {
- unsigned char i,receive=0;
- SDA1_IN();//SDA设置为输入
- for(i=0;i<8;i++ )
- {
- IIC1_SCL_L;//IIC_SCL=0;
- delay_us(2);
- IIC1_SCL_H;//IIC_SCL=1;
- receive<<=1;
- if(IIC1_SDA)receive++;
- delay_us(1);
- }
- if (!ack)
- IIC1_NAck();//发送nACK
- else
- IIC1_Ack(); //发送ACK
- return receive;
- }
- #endif
复制代码 |
|