主题中讨论的其他部件:HALCOGEN、、 PCF8574A
工具/软件:
您好:
我使用 TMS570LS3137 板作为 I2C 主器件、并使用 PCF8574T 作为 I2C 从器件。 我在 HalCoGen 中初始化了 I2C 外设、并在引脚多路复用中对 SDA 和 SCL 引脚进行引脚多路复用。 我的目的是在 LCD 上写一些纪念物。 但当我尝试用 LCD_INIT_AUEHSIM (&LCD) 初始化 LCD 时、它永远不会熄灭
而 ((i2c->STR 和 (Uint32) I2C_TX_INT)= 0U)
{
}/*等待*/
i2cSend() 函数中的函数、位于 i2c.c 文件中。 我将以蓝色注释提供所有必要的代码和解释、即 i2c.c、sys_main.c、i2c_lc.c 此外、我提供了源 files.e2e.ti.com/.../4478.i2c.ce2e.ti.com/.../i2c_5F00_lcd.ce2e.ti.com/.../4478.sys_5F00_main.c
sys_main.c
/*用户代码开头 (0)*/
/*用户代码结束*/
/*包含文件*/
#include “sys_common.h"</s>“
/*用户代码开头 (1)*/
#include “system.h"</s>“
#include “i2c.h"</s>“
#include “i2c_lcdc.h"</s>“
/*用户代码结束*/
/**@fn void main (void)
*@简短的应用程序主函数
*@请注意,此函数默认为空。
*
*此函数在启动后调用。
*用户可以使用此功能来实现应用程序。
*/
/*用户代码开头 (2)*/
void delay (uint32 delay_ms){
Uint32 i、j;
对于 (I = 0;I < DELAY_ms * 1000;I++){
对于 (j = 0;j < 5;j++);
}
}
/*用户代码结束*/
内部 main (void)
{
/*用户代码开头 (3)*/
i2cInit();
/* LCD Yap */
I2C_LCD_HandleTypeDef LCD;
lcdc.i2c = i2cREG1;
LCD.address = 0x4E;// PCF8574A I2C 地址 (0x27 << 1)
/* lcd'yi ba lat */
LCD_INIT_AUEHSIM (&LCD);//我在 LCD_INIT_AUEHSIM (&LCD) 中遇到问题
LCD_Clear (&LCD);//auehsim
/* lcd'ye mesaj Yaz */
LCD_puts (&LCD、“Merhaba TMS570“);
/*模拟*/
while (1){
LCD_send_cmd (&LCD、0xC0);// kinci sat RA git
LCD_puts (&LCD、“I2C LCD calisti“);
延迟 (1000);
LCD_send_cmd (&LCD、0x01);// Ekran temizle
延迟 (1000);
LCD_puts (&LCD、“Merhaba TMS570“);
}
/*用户代码结束*/
返回 0;
}
I2C_LCD.c
#include “i2c_lcdc.h"</s>“
#include “i2c.h"</s>“
外部无效延迟 (Uint32);
void LCD_INIT_AUEHSIM (I2C_LCD_HandleTypeDef *lcd){ //当我调用 LCD_INIT_AUEHSIM (&LCD) 时、这里会显示代码。
Delay (50);//等待 LCD 上电
LCD_send_cmd_AUEHSIM (LCD、0x30);//唤醒命令//它从不从第一个 LCD_send_cmd_AUEHSIM (LCD、0x30) 函数发出。
延迟 (5);
LCD_send_cmd_AUEHSIM (LCD、0x30);//唤醒命令
延迟 (1);
LCD_send_cmd_AUEHSIM (LCD、0x30);//唤醒命令
延迟 (10);
LCD_send_cmd_AUEHSIM (LCD、0x20);//设置为 4 位模式
延迟 (10);
LCD_send_cmd_AUEHSIM (LCD、0x28);// 4 位模式、2 行、5x8 字体
延迟 (1);
LCD_send_cmd_AUEHSIM (LCD、0x08);//显示关闭、光标关闭、闪烁关闭
延迟 (1);
LCD_send_cmd_AUEHSIM (LCD、0x01);//清除显示
延迟 (2);
LCD_send_cmd_AUEHSIM (LCD、0x06);//进入模式:光标向右移动
延迟 (1);
LCD_send_cmd_AUEHSIM (LCD、0x0C);//显示打开、光标关闭、闪烁关闭
}
void LCD_send_cmd_AUEHSIM (I2C_LCD_HandleTypeDef *lcd、char cmd){ //当我调用 LCD_send_cmd_AUEHSIM (lcd、0x30) 时;代码就会在这里显示。
char upper =(cmd & 0xF0);
char lower =((cmd << 4)& 0xF0);
uint8_t data_t[4]={
上部| 0x0C、上部| 0x08、
较低| 0x0C、较低| 0x08
};
i2cSetSlaveAdd(lc->i2c、lc->address);
i2cSetDirection (lc->i2c、I2C_transmitter);
i2cSetCount (lc->i2c、4);
i2cSetMode (LCD->i2c、I2C_MASTER);
i2cSetStop (lc->i2c);//auehsim
i2cSetStart (lc->i2c);
i2cSend (lc->i2c、4、data_t);//我认为主要问题在于 i2cSend (lc->i2c、4、data_t);函数。 因为当它进入 i2cSend 时、它会保持在无限循环中。
/*等待总线忙状态被清除*/
while (i2cIsBusy (lc->i2c)== true);
/*等待直至检测到停止*/
while (i2cIsStopDetected (lc->i2c)== 0);
/*清除停止条件*/
i2cClearSCD(lc->i2c);
}
I2C.c
void i2cSend(i2cBASE-t *i2c、uint32 长度、uint8 *数据)
{
/*用户代码开头 (17)*/
/*用户代码结束*/
IF ((g_i2cTransfer_t.mode &(uint32) I2C_TX_INT)!= 0u)
{
/*中断模式*/
/*SAFETYMCUSW 45 D Mr:21.1 “仅此驱动程序中允许使用有效的非 NULL 输入参数“*/
g_i2cTransfer_t.data =数据;
/*通过发送第一个字节开始传输*/
/*SAFETYMCUSW 45 D Mr:21.1 “仅此驱动程序中允许使用有效的非 NULL 输入参数“*/
I2C->DXR =(uint32)(* g_i2cTransfer_t.data);
/*SAFETYMCUSW 45 D Mr:21.1 “仅此驱动程序中允许使用有效的非 NULL 输入参数“*/
/*SAFETYMCUSW 567 S Mr:17.1,17.4 “需要指针递增“*/
g_i2cTransfer_t.data++;
/*长度–1、因为一个数据已经写入*/
g_i2cTransfer_t.length =(长度 — 1U);
/*启用传输中断*/
I2C->IMR |=(Uint32) I2C_TX_INT;
}
暴露
{
/*发送数据*/
while(长度> 0U)
{
/*SAFETYMCUSW 28 D 先生:不适用 “找到潜在的无限循环 — 执行序列的硬件状态检查“*/
而 ((i2c->STR &(Uint32) I2C_TX_INT)= 0u)//保持在该无限循环中。
{
}/*等待*/
/*SAFETYMCUSW 45 D Mr:21.1 “仅此驱动程序中允许使用有效的非 NULL 输入参数“*/
I2C->DXR =(Uint32)(*数据);
/*SAFETYMCUSW 45 D Mr:21.1 “仅此驱动程序中允许使用有效的非 NULL 输入参数“*/
/*SAFETYMCUSW 567 S Mr:17.1,17.4 “需要指针递增“*/
Data++;
长度--;
}
}
/*用户代码开头 (18)*/
/*用户代码结束*/
}