DSP280049C初学(5)-基于IIC的FM24CL16B存储器的使用
实现目的:
DSP280049C芯片能够通过IIC通讯实现写入和读取FM24CL16B存储器,其中本文参考了文章TMS320F280049 I2C IIC 相对于库函数操作CAT24C02 中文。
1.userIIC.h头文件配置
#ifndef USER_INC_USERIIC_H_
#define USER_INC_USERIIC_H_
#include "stdint.h"
void userIIC_int(void);
void Write_bit_F24(uint16_t ADDR,uint16_t Data);
uint8_t Read_bit_F24(uint16_t ADDR);
2.userIIC.c源文件配置
#include "F28x_Project.h"
#include "driverlib.h"
#include "device.h"
#include "IQmathLib.h"
#include "userIIC.h"
#include "userSPI.h"
#define Delay_MinTime 5*1000
// I2C PIN
#define SLAVE_ADDRESS 0x50
//初始化
void userIIC_int(void)
{
//IO初始化
GPIO_setDirectionMode(DEVICE_GPIO_PIN_SDAA, GPIO_DIR_MODE_OUT);//GPIO_DIR_MODE_IN
GPIO_setPadConfig(DEVICE_GPIO_PIN_SDAA, GPIO_PIN_TYPE_STD);//GPIO_PIN_TYPE_PULLUP
GPIO_setQualificationMode(DEVICE_GPIO_PIN_SDAA, GPIO_QUAL_ASYNC);
GPIO_setDirectionMode(DEVICE_GPIO_PIN_SCLA, GPIO_DIR_MODE_OUT);//GPIO_DIR_MODE_IN
GPIO_setPadConfig(DEVICE_GPIO_PIN_SCLA, GPIO_PIN_TYPE_STD);//GPIO_PIN_TYPE_PULLUP
GPIO_setQualificationMode(DEVICE_GPIO_PIN_SCLA, GPIO_QUAL_ASYNC);
GPIO_setPinConfig(DEVICE_GPIO_CFG_SDAA);
GPIO_setPinConfig(DEVICE_GPIO_CFG_SCLA);
//I2C模块初始化
I2C_disableModule(I2CA_BASE);
I2C_initMaster(I2CA_BASE, DEVICE_SYSCLK_FREQ, 100000, I2C_DUTYCYCLE_50);
I2C_setBitCount(I2CA_BASE, I2C_BITCOUNT_8);
I2C_setSlaveAddress(I2CA_BASE, SLAVE_ADDRESS);
I2C_setConfig(I2CA_BASE, I2C_MASTER_SEND_MODE);
I2C_setEmulationMode(I2CA_BASE, I2C_EMULATION_FREE_RUN);
//中断源为:检测到停止位,寄存器访问准备就绪
I2C_enableInterrupt(I2CA_BASE, I2C_INT_STOP_CONDITION | I2C_INT_REG_ACCESS_RDY);
I2C_enableFIFO(I2CA_BASE);
I2C_clearInterruptStatus(I2CA_BASE, I2C_INT_RXFF | I2C_INT_TXFF);
I2C_enableModule(I2CA_BASE);
}
/*
* F24CL16:16Kbit的存储器,能够存储16*1024/8=2048个uint8类型的数据
* function:向目标地址写入一个字节的数据
* parameter-ADDR:地址位,范围为0-2047
* parameter-Data:数据位,该地址为的数据大小,uint8类型,取值范围为0-255
*/
void Write_bit_F24(uint16_t ADDR,uint16_t Data)
{
I2C_setDataCount(I2CA_BASE,2);
I2C_putData(I2CA_BASE, ADDR);//发送需要写入的地址
I2C_putData(I2CA_BASE, Data);//发送需要写入的数据
I2C_setConfig(I2CA_BASE, I2C_MASTER_SEND_MODE);//设置为发送模式
I2C_sendStartCondition(I2CA_BASE);//发送起始信号,并将刚刚配置的信息发送出
I2C_sendStopCondition(I2CA_BASE);//发送终止信号
DEVICE_DELAY_US(Delay_MinTime);
SPIB_sendtwo(ADDR,Read_bit_F24(ADDR));
}
/*
* F24CL16:16Kbit的存储器,能够存储16*1024/8=2048个uint8类型的数据
* function:读取目标地址的数值
* parameter-ADDR:地址位,范围为0-2047
*/
uint8_t Read_bit_F24(uint16_t ADDR)
{
uint16_t Data;
I2C_setDataCount(I2CA_BASE,1);
I2C_putData(I2CA_BASE, ADDR);//发送地址信息
I2C_setConfig(I2CA_BASE, I2C_MASTER_SEND_MODE);//配置为发送模式
I2C_sendStartCondition(I2CA_BASE);//发送起始信号
DEVICE_DELAY_US(Delay_MinTime);
I2C_setConfig(I2CA_BASE, I2C_MASTER_RECEIVE_MODE);//配置为接收模式
I2C_sendStartCondition(I2CA_BASE);//发送起始信号
DEVICE_DELAY_US(Delay_MinTime);
Data = I2C_getData(I2CA_BASE);//读取数据
I2C_sendNACK(I2CA_BASE);//发送NACK
I2C_sendStopCondition(I2CA_BASE);//发送停止信号
DEVICE_DELAY_US(Delay_MinTime);
return Data;
}
3.main.c主函数文件配置
#include "F28x_Project.h"
#include "driverlib.h"
#include "device.h"
#include "IQmathLib.h"
#include "userGPIO.h"
#include "userSCI.h"
#include "userSPI.h"
#include "userPWM.h"
#include "userADC.h"
#include "userIIC.h"
#include "stddef.h"
void main(void)
{
Device_init();
Device_initGPIO();
DINT;
Interrupt_initModule();
Interrupt_initVectorTable();
IER = 0x0000;
IFR = 0x0000;
DELAY_US(1000L);
userGPIO_int ();
userSCIA_int ();
userIIC_int ();
SPIB_int ();
// EPWM1_int();
ADC_int();
EINT;
ERTM;
while (1)
{
Write_bit_F24(2000,255);
Write_bit_F24(123,123);
// SCIA_sendtwo(_IQtoF(a),_IQtoF(b));
// SPIB_sendtwo(0,Read_bit_F24(2000));
DELAY_US(1000000L);
}
}
4.实现过程与结果
在userIIC.c源文件配置中,写入函数的末尾加入了通过SPI向外打印数据函数,将写入函数中的地址和写入数据打印出来,运行结果如下图: