|

楼主 |
发表于 2018-12-29 10:56:05
|
显示全部楼层
你好,使用这个发送信息给 i2c 任务的方法,感觉程序比较分散啊,
另外貌似读取 io 口扩展芯片 tca 6424 程序还不行 ?????
电容触摸屏运行正常
如下:
i2c 任务:
static void vTaskI2C(void *pvParameters)
{
I2CMsg_T *pMsg;
BaseType_t xResult;
( void )pvParameters; /* 避免编译器告警 */
while(1)
{
#if 1
/* 接受数据,播放MP3文件或者WAV文件 */
xResult = xQueueReceive(xQueueI2C, /* 消息队列句柄 */
(void *)&pMsg, /* 这里获取的是结构体的地址 */
(TickType_t)portMAX_DELAY);/* 设置阻塞时间 */
if( xResult == pdPASS )
{
switch(pMsg->ucType)
{
case I2CType_Touch:
GT911_OnePiontScan(); // 每10ms 运行一次电容触摸屏,
break;
case I2CType_Tca6424:
TCA6424_KeyScanRTOS(); // io 口扩展芯片读取,目前这个地方貌似还不行,按照程序裸机看应该是没有错的,但就是读取不到数据,具体还没有整明白 ??
break;
case I2CType_Wm8978_PlayAvi: //播放avi视频
AUDIO_EnterPlayMode(); // VIDEO_EnterPlayMode();
WM8978_I2S_Cfg(I2S_MODE_PHILIPS,I2S_MODE_CFG_16BIT); //飞利浦标准,16位数据长度
break;
default : break;
}
}
#else
GT911_OnePiontScan();
TCA6424_KeyScan();
vTaskDelay(10);
#endif
}
}
// 初始化一根 rtos 软件定时器
int FreeRTOS_TimerInit(void)
{
/* 周期模式的软件定时器 1,定时器周期 1000(tick)*/
Timer1_Handle = xTimerCreate((const char*)"AutoReloadTimer",
(TickType_t)10, /* 定时器周期 10(tick) */
(UBaseType_t)pdTRUE, /* 周期模式 */
(void* )1, /* 为每个计时器分配一个索引的唯一 ID */
(TimerCallbackFunction_t)Timer1_Callback); /* 回调函数 */
if(Timer1_Handle != NULL)
{
/********************************************************************
* xTicksToWait:如果在调用 xTimerStart()时队列已满,则以 tick 为单位指定调用任务应保持
* 在 Blocked(阻塞)状态以等待 start 命令成功发送到 timer 命令队列的时间。
* 如果在启动调度程序之前调用 xTimerStart(),则忽略 xTicksToWait。在这里设置等待时间为 0.
**********************************************************************/
xTimerStart(Timer1_Handle,0); //开启周期定时器
}
else
{
return 1; //失败
}
return 0; // 成功
}
/*
软件定时器,10ms 回调函数
*/
static void Timer1_Callback(void* parameter)
{
static uint8_t TimerCntKey =0;
__IO I2CMsg_T *pI2CMsg;
if( !TCA6424_GetExtStatus())
{
TimerCntKey ++;
if(TimerCntKey >= 3) //消痘处理
{
if( !TCA6424_GetExtStatus())
{
TimerCntKey =0;
s_tI2CMsg.ucType = I2CType_Tca6424;
}
else
{
TimerCntKey =0;
// 如果没有按键按下,则扫描触摸屏
s_tI2CMsg.ucType = I2CType_Touch;
}
}
}
else
{
TimerCntKey =0;
// 如果没有按键按下,则扫描触摸屏
s_tI2CMsg.ucType = I2CType_Touch; //发送触摸屏信息给任务
}
/* 发消息 */
pI2CMsg = &s_tI2CMsg;
if(xQueueSend(xQueueI2C,
(void *)&pI2CMsg,
(TickType_t)portMAX_DELAY) == pdPASS) //消息发送成功
{
}
else //消息发送失败
{
}
}
// 播放 avi 视频,发送信息给 i2c 任务配置 wm8978
if(AVI_Handel.aviInfo.SampleRate) // 有声音数据
{
#if 1
__IO I2CMsg_T *pI2CMsg;
/* 发消息,播放新歌 */
pI2CMsg->ucType = I2CType_Wm8978_PlayAvi;
xQueueSend(xQueueI2C, //给 vTaskI2C 任务发送消息
(void *)&pI2CMsg,
(TickType_t)portMAX_DELAY);
#else
VIDEO_EnterPlayMode();
WM8978_I2S_Cfg(I2S_MODE_PHILIPS,I2S_MODE_CFG_16BIT); //飞利浦标准,16位数据长度
#endif
SAIA_Init(SAI_MODEMASTER_TX,
SAI_CLOCKSTROBING_RISINGEDGE,
SAI_DATASIZE_16,
AVI_Handel.aviInfo.SampleRate,
AVI_Handel.aviInfo.Channels,
16);
sai_tx_callback = AUDIO_SAI_CompleteCallback; //回调函数指wav_sai_dma_callback
SAIA_TX_DMA_Init(
(uint8_t *)AVI_Handel.pAudioBufferA , // 必须为内存申请地址,好触发中断
(uint8_t *)AVI_Handel.pAudioBufferB , // 必须为内存申请地址,好触发中断
AVI_Handel.AudioBufferSize/2, //预设为4096,这个音频数据大小后续再进行动态调整
SAI_DMA_WIDTH_16BIT); //配置TX DMA,16位
}
|
|