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_INGPIO_setPadConfig(DEVICE_GPIO_PIN_SDAA, GPIO_PIN_TYPE_STD);//GPIO_PIN_TYPE_PULLUPGPIO_setQualificationMode(DEVICE_GPIO_PIN_SDAA, GPIO_QUAL_ASYNC);GPIO_setDirectionMode(DEVICE_GPIO_PIN_SCLA, GPIO_DIR_MODE_OUT);//GPIO_DIR_MODE_INGPIO_setPadConfig(DEVICE_GPIO_PIN_SCLA, GPIO_PIN_TYPE_STD);//GPIO_PIN_TYPE_PULLUPGPIO_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);//发送NACKI2C_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向外打印数据函数,将写入函数中的地址和写入数据打印出来,运行结果如下图: