CONTIKI下CC2538 i2c回环测试的问题

zhou286 zhou286 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
各位前辈前天做了一个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");
}
...全文

相关推荐

基于ZigBee的无线数据采集系统设计与实现

从无线传感器网络的基本概念出发,解析ZigBee协议栈在IEEE 802.15.4基础上的分层架构与协调器、路由器、终端节点的角色分工。针对低速率、低功耗、中等距离的数据采集场景,阐述如何通过CC2530与Z-Stack构建稳定可靠的无线数据采集系统,涵盖硬件最小系统、传感器接入、电池供电设计及终端周期上报与协调器串口收包的完整代码路径。结合zigbee模块测试流程与低功耗调优方法,帮助工程师快速定位丢包问题并优化续航表现。适用于农业环境监测、工业设备状态采集、仓储温湿度记录等实际工程场景。

weixin_34224941

build-bluez-static.sh

# BlueZ 5.77 交叉编译脚本 (动态链接, 可在 OpenHarmony 上运行) # 工具链: gcc-arm-10.3-2021.07 (arm-none-linux-gnueabihf, glibc 2.33) # # 背景: OpenHarmony 使用 musl libc, 与 glibc 静态二进制不兼容 (NSS 问题) # 方案: 编译为动态链接, 打包 glibc 运行时 .so, 用自定义 ld-linux 启动

春风亭老朝1

国央企在开展内部创新项目时,如何有效进行技术成果的价值评估与资源筛选?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

BIZKEEN

电力系统风储联合一次调频仿真模型(Simulink仿真实现)

内容概要:本文详细介绍了一个基于Simulink平台构建的电力系统风储联合一次调频仿真模型,重点实现了风电与储能系统协同参与电网频率调节的动态过程。模型核心技术涵盖三电平ANPC并网逆变器控制、DPWMA调制策略、正负序分离与电网前馈控制,并引入虚拟同步发电机(VSG)控制以增强系统惯性与频率响应能力。仿真体系包含双闭环控制、中点电位平衡、虚拟阻抗、统一有源阻尼、孤岛检测等功能模块,支持在不平衡电网、弱电网等复杂工况下进行系统稳定性分析与先进控制策略验证,特别适用于低惯量电力系统中的一次调频研究与SCI级论文成果复现。; 适合人群:面向具备电力电子、电力系统自动化或新能源并网控制背景的研究生、科研人员及工程技术开发者;要求熟悉Matlab/Simulink仿真环境,有逆变器控制或微网运行研究经验者更佳。; 使用场景及目标:①开展风电与储能协同参与电网一次调频的控制策略研究;②验证VSG、下垂控制、模型预测控制(MPC)等先进控制方法在构网型逆变器中的动态性能;③复现高水平期刊论文中的电磁暂态仿真案例,支撑科研立项、论文撰写与工程项目开发。; 阅读建议:建议结合提供的参考文献与配套仿真资料,逐步搭建并调试各功能模块,重点关注控制环路设计、参数整定与阻抗建模方法,通过对比不同扰动工况下的仿真结果,深入理解系统动态响应特性与稳定性机理。

欢多天天写代码

美股分钟级别历史行情数据涵盖1分钟、5分钟、15分钟、30分钟及60分钟等不同周期 每条记录包含日期时间、开盘价、最高价、最低价、收盘价、成交量,部分数据还提供调整后的收盘价及成交笔数 所有数据按股票

美股分钟级别历史行情数据涵盖1分钟、5分钟、15分钟、30分钟及60分钟等不同周期。每条记录包含日期时间、开盘价、最高价、最低价、收盘价、成交量,部分数据还提供调整后的收盘价及成交笔数。所有数据按股票代码和日期组织,便于查看日内走势和交易活跃度。 数据源:CMES金融数据库

c_hn_007
评论 1
收藏 已收藏
分享
返回顶部
zhou286
驱动开发/核心开发 21,620 成员 21,709 内容