在线时间587 小时
UID3253488
注册时间2016-3-21
NXP金币0
TA的每日心情 | 怒 2017-1-4 08:05 |
---|
签到天数: 11 天 [LV.3]偶尔看看II
版主
- 积分
- 2569
- 最后登录
- 2019-3-28
|
本帖最后由 技术范儿 于 2016-9-2 16:32 编辑
最近用LPC812做了一个提东东,由于时间要求比较紧张直接用的官方的LPC_open,有点类似于FSL的SDK 1.x的版本,但是提供的例程还是比较丰富的,最恶心的是LPC812的IO可以随意映射其他功能(电源不算),比FSL的还灵活,废话不多说了,模拟IIC的代码呈上孝敬各位坛友了,在FSL的基础上改的,函数不多,但是Keil给整的乱码了。。。。。。最后对两位积热心助我的FAE表示感谢!- #include "iic.h"
- void delay_us(uint16_t xus)
- {
- uint16_t i,j;
- for(i=xus;i>0;i--)
- for(j=16;j>0;j--)
- __asm("NOP");
- }
- 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 SDA_OUT()
- {
- Chip_GPIO_SetPinDIROutput(LPC_GPIO_PORT,0,11);//SDA->11
- }
- static void SDA_IN()
- {
- Chip_GPIO_SetPinDIRInput(LPC_GPIO_PORT,0,11);//SDA->11
- }
-
- static void SCL_Config()
- {
- Chip_GPIO_SetPinDIROutput(LPC_GPIO_PORT,0,10);//SCL->10
- }
- uint8_t ReadSDA(void)
- {
- if(Chip_GPIO_ReadPortBit(LPC_GPIO_PORT,0,11) == true)
- return 1;
- if(Chip_GPIO_ReadPortBit(LPC_GPIO_PORT,0,11) == false)
- return 0;
-
- }
- void IIC_Start(void)
- {
- SDA_OUT(); //sda???
- IIC_SDA_H;//IIC_SDA=1;
- IIC_SCL_H;//IIC_SCL=1;
- delay_us(4);
- IIC_SDA_L;//IIC_SDA=0;//START:when CLK is high,DATA change form high to low
- delay_us(4);
- IIC_SCL_L;//IIC_SCL=0;//??I2C??,?????????
- }
- //??IIC????
- void IIC_Stop(void)
- {
- SDA_OUT();//sda???
- IIC_SCL_L;//IIC_SCL=0;
- IIC_SDA_L;//IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
- delay_us(4);
- IIC_SCL_H;//IIC_SCL=1;
- IIC_SDA_H;//IIC_SDA=1;//??I2C??????
- delay_us(4);
- }
- //????????
- //???:1,??????
- // 0,??????
- uint8_t IIC_Wait_Ack(void)
- {
- uint8_t ucErrTime=0;
- SDA_IN(); //SDA?????
- IIC_SDA_H;//IIC_SDA=1;
- delay_us(1);
- IIC_SCL_H;//IIC_SCL=1;
- delay_us(1);
- while(IIC_SDA)
- {
- ucErrTime++;
- if(ucErrTime>250)
- {
- IIC_Stop();
- return 1;
- }
- }
- IIC_SCL_L;//IIC_SCL=0;//????0
- return 0;
- }
- //??ACK??
- void IIC_Ack(void)
- {
- IIC_SCL_L;//IIC_SCL=0;
- SDA_OUT();
- IIC_SDA_L;//IIC_SDA=0;
- delay_us(2);
- IIC_SCL_H;//IIC_SCL=1;
- delay_us(2);
- IIC_SCL_L;//IIC_SCL=0;
- }
- //???ACK??
- void IIC_NAck(void)
- {
- IIC_SCL_L;//IIC_SCL=0;
- SDA_OUT();
- IIC_SDA_H;//IIC_SDA=1;
- delay_us(2);
- IIC_SCL_H;//IIC_SCL=1;
- delay_us(2);
- IIC_SCL_L;//IIC_SCL=0;
- }
- //IIC??????
- //????????
- //1,???
- //0,???
- void IIC_Send_Byte(uint8_t txd)
- {
- uint8_t t;
- SDA_OUT();
- IIC_SCL_L;//IIC_SCL=0;//??????????
- for(t=0;t<8;t++)
- {
- //IIC_SDA=(txd&0x80)>>7;
- if((txd&0x80)>>7)
- IIC_SDA_H;//IIC_SDA=1;
- else
- IIC_SDA_L;//IIC_SDA=0;
- txd<<=1;
- delay_us(2); //?TEA5767??????????
- IIC_SCL_H;//IIC_SCL=1;
- delay_us(2);
- IIC_SCL_L;//IIC_SCL=0;
- delay_us(2);
- }
- }
- //?1???,ack=1?,??ACK,ack=0,??nACK
- uint8_t IIC_Read_Byte(unsigned char ack)
- {
- unsigned char i,receive=0;
- SDA_IN();//SDA?????
- for(i=0;i<8;i++ )
- {
- IIC_SCL_L;//IIC_SCL=0;
- delay_us(2);
- IIC_SCL_H;//IIC_SCL=1;
- receive<<=1;
- if(IIC_SDA)receive++;
- delay_us(1);
- }
- if (!ack)
- IIC_NAck();//??nACK
- else
- IIC_Ack(); //??ACK
- return receive;
- }
- void IIC_Config()
- {
- SDA_OUT();
- SCL_Config();
- }
复制代码- #ifndef __IIC_H
- #define __IIC_H
- #include "hardware.h"
- #define IIC_SDA_H Chip_GPIO_SetPinOutHigh (LPC_GPIO_PORT,0,11)
- #define IIC_SDA_L Chip_GPIO_SetPinOutLow (LPC_GPIO_PORT,0,11)
- #define IIC_SCL_H Chip_GPIO_SetPinOutHigh (LPC_GPIO_PORT,0,10)
- #define IIC_SCL_L Chip_GPIO_SetPinOutLow (LPC_GPIO_PORT,0,10)
- #define IIC_SDA ReadSDA()
- void delay_us(uint16_t xus);
- void delay_ms(uint16_t xms);
- void IIC_Config(void);
- void IIC_Start(void);
- void IIC_Stop(void);
- uint8_t IIC_Wait_Ack(void);
- void IIC_Ack(void);
- void IIC_NAck(void);
- void IIC_Send_Byte(uint8_t txd);
- uint8_t IIC_Read_Byte(unsigned char ack);
- #endif
复制代码
|
|