Files
MicrochipFor32/bsp_Device/bsp_IIC.c

153 lines
4.2 KiB
C
Raw Normal View History

/*----------------------------------------------------------------------------------------------------
# THIS FILE IS A PART OF XerolySkinner's PROJECT
#
# THIS PROGRAM IS FREE SOFTWARE
#
# E-mail:ZABBCCCBBAZ@163.com
# QQ:2715099320
#
# Copyright (c) 2022 XerolySkinner
# All rights reserved.
*/
/*----------------------------------------------------------------------------------------------------
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:bsp_IIC
ʱ<EFBFBD><EFBFBD>:20220729-2031
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա:<EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD>
˵<EFBFBD><EFBFBD>:IIC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
//////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------
// ͷ<>ļ<EFBFBD>
#include "vartable.h"
#include "bsp_IIC.h"
char (*bspIIC1[2])(char)={IIC1_SCK,IIC1_SDA};
#define bspIIC_SCK(IIC_VAR) bspIIC[0](IIC_VAR)
#define bspIIC_SDA(IIC_VAR) bspIIC[1](IIC_VAR)
enum{
IIC_RESET,
IIC_SET,
IIC_READ};
//////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------
// <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//
// <09><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
void IIC_Delay(void){
unsigned char i=0;
while(++i);}
// IIC1SCK<43><4B><EFBFBD><EFBFBD>
char IIC1_SCK(char var){
if(var==IIC_RESET){
HAL_GPIO_WritePin(IIC_SCK_GPIO_Port,IIC_SCK_Pin,GPIO_PIN_RESET);
return 2;}
else if(var==IIC_SET){
HAL_GPIO_WritePin(IIC_SCK_GPIO_Port,IIC_SCK_Pin,GPIO_PIN_SET);
return 2;}
else{
return HAL_GPIO_ReadPin(IIC_SCK_GPIO_Port,IIC_SCK_Pin);}
}
// IIC1SDA<44><41><EFBFBD><EFBFBD>
char IIC1_SDA(char var){
if(var==IIC_RESET){
HAL_GPIO_WritePin(IIC_SDA_GPIO_Port,IIC_SDA_Pin,GPIO_PIN_RESET);
return 2;}
else if(var==IIC_SET){
HAL_GPIO_WritePin(IIC_SDA_GPIO_Port,IIC_SDA_Pin,GPIO_PIN_SET);
return 2;}
else{
return HAL_GPIO_ReadPin(IIC_SDA_GPIO_Port,IIC_SDA_Pin);}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------
// <09><><EFBFBD><EFBFBD>
//
//I2C<32><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD>
void IIC_Start(char (*bspIIC[])(char)){
bspIIC_SDA(SET);
bspIIC_SDA(IIC_SET);
bspIIC_SCK(IIC_SET);
IIC_Delay();
bspIIC_SDA(IIC_RESET);
IIC_Delay();
bspIIC_SCK(IIC_RESET);}
//I2C<32><43><EFBFBD><EFBFBD>ֹͣ<CDA3>ź<EFBFBD>
void IIC_Stop(char (*bspIIC[])(char)){
bspIIC_SDA(IIC_RESET);
bspIIC_SCK(IIC_SET);
IIC_Delay();
bspIIC_SDA(IIC_SET);
IIC_Delay();}
//<2F><><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ź<EFBFBD>
void IIC_SendAck(char (*bspIIC[])(char),char ackbit){
bspIIC_SCK(IIC_RESET);
bspIIC_SDA(ackbit);
IIC_Delay();
bspIIC_SCK(IIC_SET);
IIC_Delay();
bspIIC_SCK(IIC_RESET);
bspIIC_SDA(IIC_SET);
IIC_Delay();}
//<2F>ȴ<EFBFBD>Ӧ<EFBFBD><D3A6>
char IIC_WaitAck(char (*bspIIC[])(char)){
char ackbit;
bspIIC_SCK(IIC_SET);
IIC_Delay();
ackbit = bspIIC_SDA(IIC_READ);
bspIIC_SCK(IIC_RESET);
IIC_Delay();
return ackbit;}
//I2C<32><43><EFBFBD>߷<EFBFBD><DFB7><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
void IIC_SendByte(char (*bspIIC[])(char),unsigned char byt){
unsigned char i;
for(i=0; i<8; i++){
bspIIC_SCK(IIC_RESET);
IIC_Delay();
bspIIC_SDA((byt & 0x80)!=0);
IIC_Delay();
bspIIC_SCK(IIC_SET);
byt <<= 1;
IIC_Delay();}
bspIIC_SCK(IIC_RESET);}
//I2C<32><43><EFBFBD>߽<EFBFBD><DFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
unsigned char IIC_RecByte(char (*bspIIC[])(char)){
unsigned char i, da;
for(i=0;i<8;i++){
bspIIC_SCK(IIC_SET);
IIC_Delay();
da <<= 1;
if(bspIIC_SDA(IIC_READ))da |= 1;
bspIIC_SCK(IIC_RESET);
IIC_Delay();}
return da;}
//----------------------------------------------------------------------------------------------------
void IIC_WriteOneByte(char (*bspIIC[])(char),char id,char addr,char dat){
IIC_Start(bspIIC);
IIC_SendByte(bspIIC,id<<1);
IIC_WaitAck(bspIIC);
IIC_SendByte(bspIIC,addr);
IIC_WaitAck(bspIIC);
IIC_SendByte(bspIIC,dat);
IIC_WaitAck(bspIIC);
IIC_Stop(bspIIC);}
char IIC_ReadOneByte(char (*bspIIC[])(char),char id,char addr){
char temp=0;
IIC_Start(bspIIC);
IIC_SendByte(bspIIC,id<<1);
IIC_WaitAck(bspIIC);
IIC_SendByte(bspIIC,addr);
IIC_SendAck(bspIIC,0);
IIC_Start(bspIIC);
IIC_SendByte(bspIIC,(id<<1)|0x01);
IIC_SendAck(bspIIC,0);
temp=IIC_RecByte(bspIIC);
IIC_SendAck(bspIIC,1);
IIC_Stop(bspIIC);
return temp;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////