📄 main.c.bak
字号:
#include "hw_ints.h"
#include "hw_memmap.h"
#include "hw_types.h"
#include "gpio.h"
#include "sysctl.h"
#include "cpu.h"
#include "interrupt.h"
#define SETB_F_SDA() GPIOPinWrite(GPIO_PORTG_BASE, GPIO_PIN_4, GPIO_PIN_4)
#define SETB_F_SCL() GPIOPinWrite(GPIO_PORTG_BASE, GPIO_PIN_5, GPIO_PIN_5)
#define CLR_F_SDA() GPIOPinWrite(GPIO_PORTG_BASE, GPIO_PIN_4, ~GPIO_PIN_4)
#define CLR_F_SCL() GPIOPinWrite(GPIO_PORTG_BASE, GPIO_PIN_5, ~GPIO_PIN_5)
unsigned short FM3130I2CWrData(unsigned int Addr, unsigned char *WrData, unsigned short usnCount);
void FM3130I2RdData(unsigned int Addr, unsigned char *RdData, unsigned short usnCount);
void IIC_init();
void Delay(unsigned short Num);
unsigned char ucTestData[256] = "1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef";
unsigned char ucTmp[256] = {0};
int main(void)
{
SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_7_37MHZ); // 设置系统时钟的频率7.37MHz
IIC_init();
FM3130I2CWrData(0x0, ucTestData, 256);
FM3130I2RdData(0x0, ucTmp, 256);
while(1);
}
void IIC_init()
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG); //给GPIOF提供时钟
GPIODirModeSet(GPIO_PORTG_BASE, GPIO_PIN_4 | GPIO_PIN_5, GPIO_DIR_MODE_OUT); //PG4+PG5初始全部设置为输出
GPIOPadConfigSet(GPIO_PORTG_BASE, GPIO_PIN_4 | GPIO_PIN_5, // 设置强度和类型
GPIO_STRENGTH_4MA, // 4mA的输出驱动强度
GPIO_PIN_TYPE_OD_WPU); //推挽模式
}
void Delay(unsigned short Num)
{
while(Num--);
}
unsigned short FM3130I2CWrData(unsigned int Addr, unsigned char *WrData, unsigned short usnCount)
{
unsigned short TestData = 0;
unsigned short i = 0;
unsigned short j = 0;
unsigned short Tmp = 0;
unsigned short usErrTime = 100;//因故障接收方无ACK,超时值为255。
unsigned short Addr_H,Addr_L;
//停止信号******************************************************************************************
CLR_F_SCL();
Delay(10);
CLR_F_SDA();
Delay(10);
SETB_F_SCL();
Delay(10);
SETB_F_SDA();
Delay(10);
CLR_F_SCL();
//开始信号******************************************************************************************
CLR_F_SCL();
Delay(10);
SETB_F_SDA();
Delay(10);
SETB_F_SCL();
Delay(10);
CLR_F_SDA();
Delay(10);
CLR_F_SCL();
Delay(10);
//从机地址******************************************************************************************
//存储器为0xA0
Tmp = 160L << 8;
for(i = 0; i < 8; i++)
{
CLR_F_SCL();
GPIOPinWrite(GPIO_PORTG_BASE, GPIO_PIN_4, Tmp >> (11 - i));
Delay(10);
SETB_F_SCL();
Delay(10);
}
//等待ACK
usErrTime = 100;
CLR_F_SCL();
Delay(10);
SETB_F_SCL();
Delay(10);
GPIODirModeSet(GPIO_PORTG_BASE, GPIO_PIN_4, GPIO_DIR_MODE_IN); //PG4置为输入
//TestData = GPIOPinRead(GPIO_PORTG_BASE, GPIO_PIN_4);
//TestData++;
while(GPIOPinRead(GPIO_PORTG_BASE, GPIO_PIN_4));
{
usErrTime--;
if (!usErrTime)
{
CLR_F_SCL();
Delay(10);
//停止信号
CLR_F_SDA();
Delay(10);
CLR_F_SCL();
Delay(10);
SETB_F_SDA();
Delay(10);
SETB_F_SCL();
Delay(10);
GPIODirModeSet(GPIO_PORTG_BASE, GPIO_PIN_4, GPIO_DIR_MODE_OUT); //PG4置为输出
return 0x0;
}
}
GPIODirModeSet(GPIO_PORTG_BASE, GPIO_PIN_4, GPIO_DIR_MODE_OUT); //PG4置为输出
CLR_F_SCL();
Delay(10);
//发送数据地址**************************************************************************************
Addr_H = (Addr &0xFF00)>>8;
Addr_L = Addr &0x0FF;
//高字节
for(i = 0; i < 8; i++)
{
CLR_F_SCL();
GPIOPinWrite(GPIO_PORTG_BASE, GPIO_PIN_4, (Addr_H << 8) >> (11 - i));
Delay(10);
SETB_F_SCL();
Delay(10);
}
//等待ACK
usErrTime = 100;
CLR_F_SCL();
Delay(10);
SETB_F_SCL();
Delay(10);
GPIODirModeSet(GPIO_PORTG_BASE, GPIO_PIN_4, GPIO_DIR_MODE_IN); //PG4置为输入
while(GPIOPinRead(GPIO_PORTG_BASE, GPIO_PIN_4))
{
usErrTime--;
if(!usErrTime)
{
CLR_F_SCL();
//停止信号
CLR_F_SDA();
Delay(10);
CLR_F_SCL();
Delay(10);
SETB_F_SDA();
Delay(10);
SETB_F_SCL();
Delay(10);
GPIODirModeSet(GPIO_PORTG_BASE, GPIO_PIN_4, GPIO_DIR_MODE_OUT); //PG4置为输出
return 0x0;
}
}
GPIODirModeSet(GPIO_PORTG_BASE, GPIO_PIN_4, GPIO_DIR_MODE_OUT); //PG4置为输出
CLR_F_SCL();
//低字节
for(i = 0; i < 8; i++)
{
CLR_F_SCL();
GPIOPinWrite(GPIO_PORTG_BASE, GPIO_PIN_4, (Addr_L << 8) >> (11 - i));
Delay(10);
SETB_F_SCL();
Delay(10);
}
//等待ACK
usErrTime = 100;
CLR_F_SCL();
Delay(10);
SETB_F_SCL();
GPIODirModeSet(GPIO_PORTG_BASE, GPIO_PIN_4, GPIO_DIR_MODE_IN); //PG4置为输入
while(GPIOPinRead(GPIO_PORTG_BASE, GPIO_PIN_4))
{
usErrTime--;
if(!usErrTime)
{
CLR_F_SCL();
Delay(10);
//停止信号
CLR_F_SDA();
Delay(10);
CLR_F_SCL();
Delay(10);
SETB_F_SDA();
Delay(10);
SETB_F_SCL();
Delay(10);
GPIODirModeSet(GPIO_PORTG_BASE, GPIO_PIN_4, GPIO_DIR_MODE_OUT); //PG4置为输出
return 0x0;
}
}
GPIODirModeSet(GPIO_PORTG_BASE, GPIO_PIN_4, GPIO_DIR_MODE_OUT); //PG4置为输出
CLR_F_SCL();
//发送数据******************************************************************************************
for(j = 0; j < usnCount; j++)
{
Tmp = WrData[j];
Tmp = Tmp << 8;
for(i = 0; i < 8; i++)
{
CLR_F_SCL();
GPIOPinWrite(GPIO_PORTG_BASE, GPIO_PIN_4, Tmp >> (11 - i));
Delay(10);
SETB_F_SCL();
Delay(10);
}
//等待ACK
usErrTime = 100;
CLR_F_SCL();
Delay(10);
SETB_F_SCL();
GPIODirModeSet(GPIO_PORTG_BASE, GPIO_PIN_4, GPIO_DIR_MODE_IN);
Delay(10);
while(GPIOPinRead(GPIO_PORTG_BASE, GPIO_PIN_4))
{
usErrTime--;
if(!usErrTime)
{
CLR_F_SCL();
//停止信号
CLR_F_SDA();
Delay(10);
CLR_F_SCL();
Delay(10);
SETB_F_SDA();
Delay(10);
SETB_F_SCL();
Delay(10);
GPIODirModeSet(GPIO_PORTG_BASE, GPIO_PIN_4, GPIO_DIR_MODE_OUT); //PG4置为输出
return (j+1);
}
}
GPIODirModeSet(GPIO_PORTG_BASE, GPIO_PIN_4, GPIO_DIR_MODE_OUT); //PG4置为输出
CLR_F_SCL();
}
//停止信号******************************************************************************************
CLR_F_SDA();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -