CONTIKI下CC2538 i2c回环测试的问题

zhou286 2015-04-06 02:02:18
各位前辈前天做了一个CC2538往Contiki-OS下的i2c驱动移植,有TI的例程,按说例程怎么配置寄存器我就怎么配置,只是换了一个编程风格写寄存器而已。但是运行起来收不到发出的数据。之后一行一行的对照着例程查错误,并没有查出错误,实属无奈,现在贴出来,请大家帮忙。
下面是我的代码
/**
* \file
* A very simple Contiki application about i2c
*/

#include "contiki.h"
#include "shell.h"
#include <stdio.h> /* For printf() */
#include <string.h>
#include "sys/clock.h"
#include "dev/i2c.h"
#include "dev/serial-line.h"
#include "dev/sys-ctrl.h"
#include "dev/gpio.h"
#include "dev/ioc.h"
/*---------------------------------------------------------------------------*/
PROCESS(shell_i2c_process, "i2c");
SHELL_COMMAND(i2c_command,
"i2c",
"i2c: will start i2c test",
&shell_i2c_process);
/*---------------------------------------------------------------------------*/
#define END '\n'
#define BUFSIZE 128
#define SLAVE_ADDRESS 0x3C

#if (BUFSIZE & (BUFSIZE - 1) != 0)
#error UART_BUFSIZE must be a power of two
#error Chang UART_BUFSIZE
#endif

int my_i2c_input(unsigned char c);
void i2c_loop_init(void);
void i2c_init(void);
void echo_m_stat(void);
void echo_s_stat(void);
char *txbuf;

void master_slave_loopback_test(void *);
/*---------------------------------------------------------------------------*/
PROCESS_THREAD(shell_i2c_process, ev, data)
{
PROCESS_BEGIN();

printf("Enter a string for I2C test \n");
while (1) {
PROCESS_WAIT_EVENT_UNTIL(ev == serial_line_event_message && data != NULL);
master_slave_loopback_test(data);
printf("end of transmission\n");
}

PROCESS_END();
}
/*---------------------------------------------------------------------------*/
void
shell_i2c_init(void)
{
shell_register_command(&i2c_command);
}
/*---------------------------------------------------------------------------*/
void
i2c_loop_init(void)
{
/* Enable clock for the I2C while Running */
REG(SYS_CTRL_RCGCI2C) = 1;

/* RESET of I2C module */
REG(SYS_CTRL_SRI2C) = 1;

GPIO_SET_INPUT(GPIO_PORT_TO_BASE(CC2538_I2C_SCL_PORT_NUM), GPIO_PIN_MASK(CC2538_I2C_SCL_PIN_NUM));
GPIO_SET_INPUT(GPIO_PORT_TO_BASE(CC2538_I2C_SDA_PORT_NUM), GPIO_PIN_MASK(CC2538_I2C_SDA_PIN_NUM));
/* Put all the I2C gpios into peripheral mode */
GPIO_PERIPHERAL_CONTROL(GPIO_PORT_TO_BASE(CC2538_I2C_SCL_PORT_NUM), GPIO_PIN_MASK(CC2538_I2C_SCL_PIN_NUM));
GPIO_PERIPHERAL_CONTROL(GPIO_PORT_TO_BASE(CC2538_I2C_SDA_PORT_NUM), GPIO_PIN_MASK(CC2538_I2C_SDA_PIN_NUM));
/* Disable any pull ups or the like */
ioc_set_over(CC2538_I2C_SCL_PORT_NUM, CC2538_I2C_SCL_PIN_NUM, IOC_OVERRIDE_DIS);
ioc_set_over(CC2538_I2C_SDA_PORT_NUM, CC2538_I2C_SDA_PIN_NUM, IOC_OVERRIDE_DIS);

/* Set the mux correctly to connect the I2C pins to the correct GPIO pins */
/* input */
REG(IOC_I2CMSSCL) = (CC2538_I2C_SCL_PORT_NUM << 3) + CC2538_I2C_SCL_PIN_NUM;
REG(IOC_I2CMSSDA) = (CC2538_I2C_SDA_PORT_NUM << 3) + CC2538_I2C_SDA_PIN_NUM;
/* output */
ioc_set_sel(CC2538_I2C_SCL_PORT_NUM, CC2538_I2C_SCL_PIN_NUM, IOC_PXX_SEL_I2C_CMSSCL);
ioc_set_sel(CC2538_I2C_SDA_PORT_NUM, CC2538_I2C_SDA_PIN_NUM, IOC_PXX_SEL_I2C_CMSSDA);

/* enable LOOP */
REG(I2CM_CR) |= I2CM_CR_LPBK;

/* enable master mode */
REG(I2CM_CR) |= I2CM_CR_MFE;

/* Configure the SCL 100Kbps */
REG(I2CM_TPR) = 7;

/* enable slave mode*/
REG(I2CM_CR) |= I2CM_CR_SFE;
REG(I2CS_CTRL) = I2CS_CTRL_DA;
/* set slave own address */
REG(I2CS_OAR) = SLAVE_ADDRESS;
/* Tell the master module what address it will place on the bus */
REG(I2CM_SA) = (SLAVE_ADDRESS << 1) | 0;
}
/*---------------------------------------------------------------------------*/
void
master_slave_loopback_test(void *data)
{
static int i, j;
static char *txbuf;
static char rxbuf[128] = "";



txbuf = (char *)data;
i2c_loop_init();
printf("\n\n\nI2C Loopback Example ->\n");
printf(" Module = I2C\r\n");
printf(" Mode = Single Send/Receive\n");
printf(" Rate = 100kbps\n");
printf("\nTranferring from: Master -> Slave\n");
for (i = 0; i < strlen(txbuf); i++) {
printf(" Sending: %c . . .", txbuf[i]);
flush();
/*send 1 byte*/
REG(I2CM_DR) = txbuf[i];
/* 发送命令让数据发出 */
REG(I2CM_CTRL) = I2C_MASTER_CMD_SINGLE_SEND;
/* 如果收到数据,从机拉低数据线拖延主机,如果没有收到,则等待 */
while(!REG(I2CS_STAT) & I2C_SLAVE_ACT_RREQ)
echo_s_stat();
rxbuf[i] = REG(I2CS_DR);
printf("%c\n", rxbuf[i]);
}
printf("receive string: %s\n", rxbuf);
}
/*-------------------------------------------------------- */
void
echo_m_stat(void)
{
static int stat;

printf("master stat: \n");
stat = REG(I2CM_STAT);
if (stat & I2CM_STAT_BUSY) {
printf("i2c_busy\n");
return;
}
if (stat & I2CM_STAT_ERROR)
printf("has error\n");
if (stat & I2CM_STAT_BUSBSY)
printf("i2c_bus_busy\n");
if (stat & I2CM_STAT_IDLE)
printf("i2c_idle\n");
if (stat & I2CM_STAT_ARBLST)
printf("lost arblst\n");
if (stat & I2CM_STAT_DATACK)
printf("send data not rev ack\n");
if (stat & I2CM_STAT_ADRACK)
printf("send address not rev ack\n");
}
/* ------------------------------------------------------- */
void
echo_s_stat(void)
{
static int stat;

printf("slave stat: \n");
stat = REG(I2CS_STAT);
if (stat & I2C_SLAVE_ACT_RREQ) {
printf("master has sent data\n");
if (stat & I2C_SLAVE_ACT_RREQ_FBR)
printf("master has sent first byte\n");
}
if (stat & I2C_SLAVE_ACT_TREQ)
printf("mast has requested data\n");
}
...全文
383 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhou286 2015-04-07
  • 打赏
  • 举报
回复
问题找到了,把重启I2C模块功能去掉就好了,但是不知道为什么不能重启。
  
  /* RESET of I2C module */
  REG(SYS_CTRL_SRI2C) = 1;
内容概要:本文系统研究了基于豪猪优化算法(CPO)的多无人机协同集群在三维空间中的避障路径规划问题,聚焦于实现以最低成本为目标的航迹优化,综合考虑路径长度、飞行高度、威胁规避及转弯角度等多个关键因素。通过构建精细化的三维环境模型与多无人机协同机制,采用Matlab平台实现CPO算法的仿真与验证,充分展示了该算法在复杂动态障碍环境下的高效搜索能力与全局优化性能。研究不仅涵盖了路径规划的数学建模与目标函数设计,还深入探讨了算法的收敛特性与鲁棒性,为智能群体系统在实际场景中的应用提供了理论依据与技术支撑。; 适合人群:具备一定编程基础和优化算法背景,从事无人机系统控制、智能路径规划、群体协同、人工智能与自动化等相关领域的科研人员、高校研究生及工程技术人员。; 使用场景及目标:①应用于多无人机协同执行侦察、灾害监测、应急救援、区域巡检等复杂任务中的自主路径规划;②为智能优化算法在三维动态环境下的路径决策问题提供可复现的技术范例;③支持研究人员对CPO算法与其他主流群智能算法(如PSO、GWO、WOA等)进行性能对比与改进研究,推动路径规划技术的发展。; 阅读建议:建议结合提供的Matlab代码进行实践操作,重点理解目标函数的多维度建模方式与CPO算法的迭代优化流程,可通过调整环境参数与约束条件进行仿真实验,对比不同算法在相同场景下的路径质量与收敛速度,从而深入掌握其优势与适用边界。
内容概要:本文围绕电动汽车参与电力系统运行备用的能力评估展开深入研究,利用Matlab代码实现对电动汽车集群提供运行备用服务的建模与仿真分析。研究重点在于量化电动汽车作为分布式灵活资源参与电网辅助服务的潜力,通过构建精细化的数学模型,分析其可调功率容量、响应速度、时空分布特性及聚合能力,并采用多面体聚合、内近似模型与闵可夫斯基和等先进方法精确刻画其可调度能力边界。研究进一步结合大规模电动汽车接入场景,探讨其在多时间尺度调度框架下参与调峰、调频等辅助服务的优化策略,评估其对提升高比例可再生能源电网灵活性与稳定性的贡献,最终通过仿真验证所提模型与方法的有效性与实用性。; 适合人群:具备电力系统分析、智能电网、新能源汽车或优化调度等相关专业背景,熟悉Matlab/Simulink仿真工具,从事科研、工程应用的高校研究生、科研人员及电力行业工程师。; 使用场景及目标:①精确评估大规模电动汽车集群在不同约束条件下可提供的运行备用容量;②研究电动汽车在日前、日内及实时调度中的动态响应能力与优化调度策略;③为高渗透率新能源电力系统提供基于移动储能的灵活性资源解决方案,支撑电网安全经济运行。; 阅读建议:建议结合Matlab代码与技术文档同步学习,重点关注多面体聚合建模、能力边界计算及优化调度算法的设计与实现,可进一步拓展至V2G(车辆到电网)、需求响应等互动场景进行二次开发与应用验证。
打开链接下载源码: https://pan.quark.cn/s/a4b39357ea24 OpenCV(开源计算机视觉库)中的DNN(Deep Neural Network)模块是一种功能强大的工具,其目的是用于深度学习模型的操作。该模块使得开发人员能够在OpenCV环境中直接运用已经训练好的深度学习网络,以执行图像识别、目标检测、图像分割等多种功能。DNN模块能够兼容多种深度学习框架的模型,包括TensorFlow、Caffe、ONNX等。 一、DNN模块概述 OpenCV的DNN模块是为了简化深度学习模型的集成过程而专门设计的,它允许开发人员加载预先训练好的神经网络模型,并在图像数据上执行前向传播操作。借助这个模块,用户可以选用GPU或者CPU来提升计算效率,从而构建出高效的应用程序。 二、目标检测案例 在OpenCV的DNN模块中,目标检测是一个常见的应用情形。例如,可以选用SSD(Single Shot Multibox Detector)、YOLO(You Only Look Once)或者 Faster R-CNN 等模型进行实时的目标检测。这些模型能够识别并定位图像中的多个对象,并返回每个对象的类别和边界框坐标。 三、模型转换:PB到PBTXT 在OpenCV中运用TensorFlow模型时,通常需要处理的是`.pb`格式的模型文件,这是TensorFlow的二进制模型文件格式。然而,为了能够读取模型的结构信息,我们需要`.pbtxt`格式的文本文件。转换过程涉及解析`.pb`文件并将其结构信息导出为`.pbtxt`格式,这样做可以让人清晰地了解网络层和参数的配置。在OpenCV中,可以使用`tf.train.write_graph()`函数将.pb...

21,620

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧