#include "IB_Reader.h" #include "gpio.h" #define IB_READ_ROM (0x33) #define IB_MATCH_ROM (0x55) #define IB_SEARCH_ROM (0xF0) #define IB_SKIP_ROM (0xCC) #define IB_WRITE_SCRATCHPAD (0x0F) #define IB_READ_SCRATCHPAD (0xAA) #define IB_COPY_SCRATCHPAD (0x55) #define IB_READ_MEMORY (0xF0) static uint8_t rom_id[16]={0}; /** * @brief 初始化 * @param 无 * @retval ACK应答位 **/ uint8_t OneWire_Init() { uint8_t Ackbit = 0; IBTX_WIRE_HIGH; //先将总线拉高 IBTX_WIRE_LOW; //然后将总线拉低 udelay(500); IBTX_WIRE_HIGH; //释放总线 udelay(70); //Delay 70 us Ackbit=IBRX_WIRE_BIT; //读取应答位 udelay(500); //Delay 500 us return Ackbit; } /** * @brief 发送一位 * @param Bit * @retval 无 **/ void OneWire_Senbit(uint8_t Bit) { IBTX_WIRE_LOW; //拉低 udelay(5); //Delay 10 us(考虑到调用函数需要时间,实际i可以适当取的更大) //发送一位 if(0 == Bit){ IBTX_WIRE_LOW; }else{ IBTX_WIRE_HIGH; } //讲解:从发送0和发送1俩个不同的时序可以看出,如果我们在10us的时候将Bit放在DQ上,如果是0 // 则DQ一直会被拉低,如果是1,主机也会将DQ拉高,最后等50us后将数据发送即可 udelay(45); //Delay 50 us IBTX_WIRE_HIGH; //拉高,便于下次发送 } /** * @brief 接受一位 * @param 无 * @retval Bit **/ uint8_t OneWire_ReceiveBit() { uint8_t Bit; IBTX_WIRE_LOW; udelay(3); //Delay 5 us IBTX_WIRE_HIGH; udelay(5); //Delay 5 us //解释:读取数据需要在15us内进行(贴近15us的时候),如果是0,DQ会在5us后被从机拉低, // 如果是1, DQ会在5us后被从机拉高 Bit=IBRX_WIRE_BIT; //进行数据接受 udelay(50); //Delay 50 us return Bit; } /** * @brief 发送一个字节 * @param Byte * @retval 无 **/ void OneWire_SenByte(uint8_t Byte) { uint8_t i; for(i=0;i<8;i++) { OneWire_Senbit(Byte&(0x01<