📄 iic.c
字号:
#include "iic.h"void IICDelayLoop(){ asm volatile ( "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop\n" "nop");}void IICDelay(int cnt){ int i; for(i=0; i<10*cnt; i++) IICDelayLoop();}void IICinit(){ IIC_SDA_OUT(); IIC_SDA_SET(); IIC_SCL_OUT(); IIC_SCL_SET();}void IICStart(void) /* statr the iic bus */{ IIC_SDA_OUT(); IIC_SDA_SET(); IIC_SCL_OUT(); IIC_SCL_SET(); IICDelay(IIC_PUSH_DELAY); IIC_SDA_OUT(); /*does this option necessary ?*/ IIC_SDA_CLR(); IICDelay(IIC_PUSH_DELAY); IIC_SCL_CLR(); IICDelay(IIC_PUSH_DELAY);}void IICStop(void) /* stop the iic bus */{ IIC_SDA_OUT(); IIC_SDA_CLR(); IICDelay(IIC_PUSH_DELAY); IIC_SCL_SET(); IICDelay(IIC_PUSH_DELAY); IIC_SDA_SET(); IICDelay(IIC_PUSH_DELAY);}void IICWrite(int buf) /* write the iic bus */{ int i; IIC_SDA_OUT(); buf &= 0xff; for(i = 0; i <= 7; i++) { if((buf & 0x80)) IIC_SDA_SET(); else IIC_SDA_CLR(); IICDelay(IIC_PUSH_DELAY); IIC_SCL_SET(); IICDelay(IIC_PUSH_DELAY); IIC_SCL_CLR(); IICDelay(IIC_PUSH_DELAY); buf = buf << 1; }}int IICChkAck(void) /* chack the acknowledge signel */{ int WaitTime; IIC_SDA_IN(); IICDelay(IIC_PUSH_DELAY); IIC_SCL_SET(); IICDelay(IIC_PUSH_DELAY); WaitTime = IIC_WAIT_TIME; while(IIC_SDA_GET()) { WaitTime--; if(WaitTime <= 0) break; } /* to do : read ack signal */ IIC_SCL_CLR(); IICDelay(IIC_PUSH_DELAY); /* to do : add err deal */ if(WaitTime != 0) return IIC_ACK_SUCCESS; printf("iic time out!\n"); return IIC_ACK_ERROR;}int IICWriteByte(int SlaveAddr, int ByteAddr, int data, int mode){ int addr; addr = (SlaveAddr & 0x7f) << 1; //printf("%d ", addr); IICStart(); IICWrite(addr); if(IICChkAck() != IIC_ACK_SUCCESS) { IICStop(); return IIC_ERROR; } IICWrite(ByteAddr); //printf("%d ", ByteAddr); if(IICChkAck() != IIC_ACK_SUCCESS) { IICStop(); return IIC_ERROR; } IICWrite(data); //printf("%d\n", data); if(IICChkAck() != IIC_ACK_SUCCESS) { IICStop(); return IIC_ERROR; } IICStop(); return IIC_OK;}void ak8817_reset(void){ AK8817_RESET_OUT(); AK8817_RESET_SET(); IICDelay(10); AK8817_RESET_OUT(); AK8817_RESET_CLR(); IICDelay(10); AK8817_RESET_OUT(); AK8817_RESET_SET(); IICDelay(10); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -