主题中讨论的其他器件: C2000WARE
工具/软件:Code Composer Studio
我已经在使用 LaunchPad F28377S 一段时间了。 我最近有一个 OLED I2C 显示屏可以使用。 在 TMS320F28377S 技术参考指南中、他们提到了用于 I2C-A 的 GPIO 42、43和 GPIO 91、92 但我决定使用 GPIO 42和43。 我无法在这些引脚上获得任何输出(时钟和数据都不是)。 我已经尝试过 GPIO 91、92、但没有成功。 以下是我的代码:
#include "F28x_Project.h" /** * main.c */ #define OLED_I2C_address 0x3C //控制字节 #define OLED_CONTRAL_BYTE_CMD_SINGLE 0x0080 #define OLED_CONTRAL_BYTE_CMD_STREAM 0x0000 #define OLED_CONTRAL_BYTE_DATA_STREAM 0x0040 //基本命令( #define OLED_CONTRAL_CMD_SET) 0x0081 //后面跟随0x7F #define OLED_CMD_DISPLAY_RAM 0x00A4 #define OLED_CMD_DISPLAY_Allon 0x00A5 #define OLED_CMD_DISPLAY_NORMAL 0x00A6 #define OLED_CMD_DISPLAY_INPTED 0x00A7 #define OLED_CMD_DISPLAY_OFF 0x00AE #define OLED_CMD_DISPLAY_ON 0x00AF //寻址命令表(第30页) #define OLED_CMD_SET_MEMORY_ADDR_MODE 0x0020 //跟随0x00 = HORZ 模式=行为类似于 KS108图形 LCD #define OLED_CMD_SET_COLUMN_RANGE 0x0021 //只能在 HORZ/垂直模式下使用-之后是0x00和0x7F = COL127 #define OLED_CMD_SET_PAGE_RANGE 0x0022 //只能在 HORZ/垂直模式下使用-遵循0x00和0x07 = page7 //硬件配置(第31页) #define OLED_CMD_SET_DISPLAY_START_LINE 0x0040 #define OLED_CMD_SET_SECTOR_REMAP 0x00A1 #define OLED_CMD_SET_MUX_RA比 0x00A8 //跟随0x3F = 64 MUX #define OLED_CMD_SET_COM_SCAN_MODE 0x00C8 #define OLED_CMD_SET_DISPLAY_OFFSET 0x00D3 //后面跟随0x00 #define OLED_CMD_SET_COM_PIN_MAP 0x00DA //跟随0x12 #define OLED_CMD_NOP 0x00E3 // NOP //时序和驱动方案(第32页) #define OLED_CMD_SET_DISPLAY_CLK_DIV 0x00D5 //后面跟随0x80 #define OLED_CMD_SET_PREARGE 0x00D9 //遵循0xF1 #define OLED_CMD_SET_VCOMH_DESELCT 0x00DB //跟随0x30 //电荷泵(第62页) #define OLED_CMD_SET_CHARGE_PUMP 0x008D //跟随0x14 void OLED_init (UINT16 Slave_address); void I2C_Write (UINT16 Slave_address、UINT16 No_OF_DATABytes、UINT16 Write_Array[]); void I2C_WriteByte (UINT16 Slave_address、 uint16数据库); uint16 Pattern1[17]={0x0040、0x000000、0x007E、0x0042、0x0042、0x0042、0x007E、0x000000、0x007E、0x0042、0x0042、0x0042、0x0042、0x007E、0x0000}; iint_i_i_it_invoid (uint_it_it_it_int) ; InitSysCtrl(); InitGpio(); I2C_A_GPIO_init (); InitPieCtrl(); InitPieVectTable(); I2CA_Init(); I2caRegs.I2CMDR.bit.IRS = 0; I2caRegs.I2CPSC.all = 19;// I2C 时钟应该介于7MHz-12MHz 之间 I2caRegs.I2CCLKL = 45; //预分频器设置为100kHz 比特率 I2caRegs.I2CCLKH = 45; //在10MHz I2C 时钟上 I2caRegs.I2CMDR.bit.IRS = 1; UINT16 Slave_address = 0x003C; OLED_INIT (Slave_address); uint16 write_array[7]={OLED_CONTRAL_BYTE_CMD_STREAM、OLED_CMD_SET_COLUMN_RANGE、0x0000.0x007F、OLED_CMD_SET_PAGE_RANGE、0x0000.0x0007}; I2C_Write (Slave_address、7、write_array); I2C_Write (Slave_address、17、Pattern1); return 0; } void I2C_Write (UINT16 Slave_address、UINT16 No_for_databytes、UINT16 Write_Array[]) { /*UINT16 I = 0; I2caRegs.I2CSAR.all = Slave_address; while (I2I2Write_Array=0=I2I2I2I2I2I2Mspa.r.I2I2I2Mspa. ) ;Id=0X2I2I2I2I2I2I2I2I2I2I2I2I2I2I2R.R // 待发送的数据字节 while (i < NO_OR_DATABytes) { while (I2cRegs.I2CSTR.bit.XRDY!= 1); DSP28x_usDelay (5000); if (I2cRegs.I2CSTR.bit.XRDY = 1) { I2SCRegs.i+= 1);while (I2CSTR.I2CSTR+.I2CSTR.I2+= 1);+= 1 *.I2CSTr.I2CSTr.I2CSTr.I2CSTr.I2CSTR+.I = 1) I2caRegs.I2CMDR.bit.IRS = 1; //复位 I2C //确保 I2C 不忙且已停止 while (I2cRegs.I2CSTR.bit.BB = 1); //忙循环 I2caRegs.I2CSTR.bit.SCD = 1; //清除 SCD 位(停止条件位) while (I2caRegs.I2CMDR.bit.STP==1); //停止位循环 I2caRegs.I2CSAR.All = Slave_address; // I2C 从地址 while (I2cRegs.I2CSTR.bit.BB = 1); //仍然忙? I2caRegs.I2CCNT =无数据字节; //假设寄存器地址= 1字节,数据为1字节 //I2caRegs.I2CMDR.ALL = 0x6E20; //开始,停止,无 rm,重置 i2c 01101110 00100000 I2caRegs.I2CMDR.bit.NACKMOD = 0; // NACK 模式位 I2caRegs.I2CMDR.bit.FREE = 1; //挂起时运行空闲 I2C I2caRegs.I2CMDR.bit.STT = 1; //起始条件位 I2caRegs.I2CMDR.bit.STP= 1; //停止条件位 I2caRegs.I2CMDR.bit.MST = 1; //主模式 I2caRegs.I2CMDR.bit.TRX = 1; //发送器模式 I2caRegs.I2CMDR.bit.XA = 0; // 7位寻址模式 I2caRegs.I2CMDR.bit.RM = 0; //非重复模式 I2caRegs.I2CMDR.bit.DLB = 0; //数字回送模式被禁用 I2caRegs.I2CMDR.bit.IRS = 1; //启用 I2C 模块 I2caRegs.I2CMDR.bit.STB = 0; // I2C 模块不处于起始字节模式 I2caRegs.I2CMDR.bit.FDF = 0; //禁用自由数据格式模式 I2caRegs.I2CMDR.bit.BC = 0; //每个数据字节8位 uint16 i; for (i=0;i
